2011-07-10 11 views
5

Mam stanowisko struct coś takiego:Przełęcz struct do performSelector: withObject: afterDelay:

typedef struct Position { int x, y; } Position; 

Jak mogę przekazać go w NSObject performSelector:withObject:afterDelay:? Tak:

Position pos; 
pos.x = pos.y = 1; 
[self performSelector:@selector(foo:) 
      withObject:pos    // ERROR 
      afterDelay:5.0f]; 

EDIT: zmieniony kod naprawić typo

Odpowiedz

3

Można owinąć typ niestandardowy za pomocą NSValue klasę. Błąd polega na tym, że nie podano referencji do metody.

Spróbuj użyć metody klasy NSValue 's . Po drugiej stronie możesz pobrać wartość za pomocą -(void)getValue:(void *)buffer;.

9

Uhm .. użyć CGPoint i coś podobnego

[self performSelector:@selector(foo:) 
      withObject:[NSValue valueWithCGPoint:CGPointMake(pos.x, pos.y)] 
      afterDelay:5.0f]; 

i przeczytaj go ponownie jako

NSValue v; 
CGPoint point = [v CGPointValue]; 

lub opuścić klasę Pozycja dala całkowicie CGPoint robi to samo

0

preformSelector:withObject: akceptuje tylko obiekty jako parametry, dlatego musisz zastosować metodę foo:, aby zaakceptować obiekt. Istnieją dwa sposoby, aby zdać strukturę, jako obiekt:

  • tworzą przedmiot struct lub podobny
  • owinąć w NSValue i rozpakowanie go w sposobie.
0

Pełna odpowiedź, oparta na user756245 (która nie mówi, jak z niego korzystać, a nie pomoc). Również, Apple sugeruje użyć nieco innej metody te dni, IIRC:

typedef myStruct { int a; } myStruct; 

myStruct aLocalPointer = ... assign to it 

[self performSelector:@selector(myOtherMethod:) withObject:[NSValue value:&aLocalPointer withObjCType:@encode(myStruct)] afterDelay:0.25]; 
0

to najprawdopodobniej kłopoty, ale można przejść CGPoint jako id poprzez zapełnienie go w ten sposób:

withObject:(__bridge id)((void *)(&point))

Spowoduje to awarię, jeśli point znajdzie się poza zakresem, a Twój selektor spróbuje ją odczytać.

Powiązane problemy