Pregunta

Estoy tratando de escribir una biblioteca para que sea lo suficientemente genérica como para que sea útil. El problema es que necesita actualizar las propiedades de otras clases, tanto la propiedad como la clase deben ser dinámicas.

Ahora puedo hacerlo usando variables públicas sin problema, solo paso un puntero a la variable que quiero actualizar. Sin embargo, también sería increíblemente útil establecer las propiedades de las clases, ya que se usan con tanta libertad en el objetivo C.

Ahora, nuevamente, esto no es un problema, siempre que la propiedad sea un tipo de objeto, tratando de establecer propiedades de tipo primitivas.

Mi código actual se ve algo en estas líneas para las propiedades:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[[myInstance class] instanceMethodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
[invoc setArgument:&myObject atIndex:2];
[invoc invoke];

Sin embargo, el método setArgument solo permite tipos de puntero, pero las propiedades pueden tener cualquier tipo primitivo. ¿Hay alguna forma de asignar dinámicamente propiedades de tipo primitivo?

¿Fue útil?

Solución

KVO debería hacer la conversión por usted:

[object setValue:[NSNumber numberWithInt:i] forKey:@"myVar"];

convertirá el NSNumber a int si su myVar se define como:

int myVar;
...
@propery (nonatomic) int myVar;

Otros consejos

" Sin embargo, el método setArgument solo permite tipos de puntero " Te estás perdiendo algo. El argumento para setArgument: no son los datos que está pasando al método. Es la dirección de los datos (del tipo ) que está pasando. En este momento, su código anterior toma la dirección de un puntero de objeto (es un puntero a un puntero). Con la misma facilidad puede hacer que tome la dirección de un número entero (no le importa). En otras palabras, su mismo código exacto ya funciona independientemente del tipo:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top