Domanda

Sto cercando di scrivere una libreria in modo che sia abbastanza generico da essere utile. Il problema è che deve aggiornare le proprietà di altre classi, sia la proprietà che la classe devono essere dinamiche.

Ora posso farlo usando le variabili pubbliche senza problemi, ho solo passare un puntatore alla variabile che voglio aggiornare. Tuttavia sarebbe anche incredibilmente utile impostare le proprietà delle classi, dal momento che sono utilizzate così liberamente nell'obiettivo C.

Ora, questo non è un problema, purché la proprietà sia un tipo di oggetto, provando a impostare le proprietà del tipo primitivo.

Il mio codice attuale cerca qualcosa in questo senso per le proprietà:

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

Tuttavia, il metodo setArgument consente solo i tipi di puntatore, tuttavia le proprietà possono avere qualsiasi tipo di primitiva. Esiste un modo per assegnare dinamicamente le proprietà del tipo primitivo?

È stato utile?

Soluzione

KVO dovrebbe fare la conversione per te:

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

convertirà il NSNumber in un int se myVar è definito come:

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

Altri suggerimenti

" Tuttavia, il metodo setArgument consente solo i tipi di puntatore " Ti stai perdendo qualcosa. L'argomento su setArgument: non sono i dati che stai passando al metodo. È l'indirizzo dei dati (di qualunque tipo) che stai trasmettendo. In questo momento il tuo codice sopra prende l'indirizzo di un puntatore ad oggetto (è un puntatore a un puntatore). Puoi facilmente far sì che prenda l'indirizzo di un numero intero (non importa). In altre parole, il tuo stesso codice esatto funziona già indipendentemente dal tipo:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top