2011-07-10 9 views
5

que tienen una posición de estructura, de esta manera:Pass estructura a performSelector: withObject: afterDelay:

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

¿En qué puedo pasarlo en NSObject performSelector:withObject:afterDelay:? De esta manera:

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

EDIT: código cambió para corregir error tipográfico

Respuesta

3

Se puede envolver su tipo personalizado utilizando NSValue clase. El error es que no proporcionó una referencia de objeto al método.

Pruebe utilizar el método de clase NSValue+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;. En el otro lado, puede recuperar el valor usando -(void)getValue:(void *)buffer;.

9

Uhm .. utilizar un CGPoint y algo así como

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

y leerlo de nuevo como

NSValue v; 
CGPoint point = [v CGPointValue]; 

o salir de la clase Posición por completo, CGPoint hace lo mismo

0

preformSelector:withObject: acepta solo objetos como parámetros, por lo tanto, deberá implementar su método foo: para aceptar un objeto. Hay dos formas de pasar el struct como un objeto:

  • crear un objeto struct-como o
  • envolverlo en NSValue y desenvolverlo en el método.
0

Respuesta completa, basada en user756245 (que no te dice cómo usarlo, no es de mucha ayuda). Además, Apple sugiere que utilice un método ligeramente diferente en estos días, 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

Esto es más probable buscar problemas, pero se puede pasar CGPoint como id, cerrando de esta manera:

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

Esto dará lugar a un bloqueo si point sale del alcance y su selector intenta leerlo.

Cuestiones relacionadas