Pergunta

Eu estou tentando escrever uma biblioteca de modo que é bastante genérico que a sua utilidade. O problema é que ele precisa para propriedades de atualização de outras classes, tanto a propriedade e classe deve ser dinâmico.

Agora eu posso fazê-lo usando variáveis ??públicas não há problema, eu só passar um ponteiro para a variável que deseja atualizar. No entanto, também seria extremamente útil para propriedades conjunto de classes, bem como, uma vez que eles são usados ??tão liberalmente em C objetivo.

Agora, novamente este não é um problema, desde que a propriedade é um tipo de objeto, tentando definir as propriedades de tipo primitivo.

Meu código atual é algo ao longo destas linhas para propriedades:

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

No entanto, o método permite setArgument apenas para tipos de ponteiro, ainda propriedades estão autorizados a ter qualquer tipo primitivo. Existe alguma maneira de atribuir dinamicamente as propriedades de tipo primitivo?

Foi útil?

Solução

KVO deve fazer a conversão para você:

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

irá converter o NSNumber para um int se o seu myVar é definido como:

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

Outras dicas

"No entanto, o método setArgument permite apenas para tipos de ponteiro" Você está faltando alguma coisa. O argumento para setArgument: não é os dados que você está passando para o método. É o endereço dos dados (de qualquer que seja tipo) que você está passando. Agora o seu código acima assume o endereço de um ponteiro de objeto (que é um ponteiro para um ponteiro). Você pode facilmente torná-lo tomar o endereço de um inteiro (não importa). Em outras palavras, o mesmo código exato já funciona independentemente do 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top