Qual é o mecanismo subjacente à síntese de ivar no tempo de execução moderno do Objective C
Um dos recursos do tempo de execução do Objective C moderno (OS X e iPhone OS) de 64 bits é a capacidade das propriedades de sintetizar dinamicamente ivars sem declará-los explicitamente na classe:
@interface MyClass : NSObject {
// NSString *name; unnecessary on modern runtimes
}
@property (retain) NSStrng *name;
@end
@implementation MyClass
@synthesize name;
@end
Em um pouco do meu código, uso implementações de getter personalizadas para inicializar as propriedades:
- (NSString *) name {
if (!name) {
name = @"Louis";
}
return name;
}
O acima é incompatível com ivars sintetizados, pois ele precisa acessar um ivar que não está declarado no cabeçalho. Por várias razões, eu gostaria de atualizar várias de minhas estruturas pessoais para usar ivars sintetizados quando criados nos tempos de execução modernos, o código acima precisa ser modificado para trabalhar com ivars sintetizados para atingir esse objetivo.
Enquanto a documentação do Objective C 2.0 afirma que os acessadores sintetizados no tempo de execução moderno sintetizam o ivar no primeiro uso. Ele não especifica qual mecanismo de baixo nível é usado para fazer isso. Isso é feito por class_getInstanceVariable (), as restrições sobre class_addIvar () são diminuídas? É uma função não documentada no objetivo do tempo de execução do C 2.0? Embora eu possa implementar meu próprio armazenamento lateral para os dados que fazem backup de minhas propriedades, prefiro usar o mecanismo que os acessadores sintetizados estão usando.