Qual é o mecanismo subjacente de ivar síntese moderna com Objetivo de tempo de execução C

StackOverflow https://stackoverflow.com/questions/275034

  •  07-07-2019
  •  | 
  •  

Pergunta

Uma das características do moderno (64 bits mac OS X e iPhone OS) Objetivo de tempo de execução C é a capacidade para que as propriedades dinamicamente sintetizar 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 eu uso personalizado getter implementações para inicializar as propriedades:

- (NSString *) name {
  if (!name) {
    name = @"Louis";
  }

  return name;
}

O acima é incompatível com sintetizada ivars, pois precisa de acesso a um ivar que não é declarado no cabeçalho.Por várias razões, eu gostaria de atualização de um número dos meus quadros para usar sintetizada ivars quando construído nos modernos tempos de execução, o código acima precisa ser modificado para trabalhar com sintetizada ivars, a fim de atingir esse objetivo.

Enquanto o objective-C 2.0 documentação indica que o sintetizado acessores no moderno runtime irá sintetizar o ivar na primeira utilização.Ele não especifica o que baixa o nível de mecanismo é usado para fazer isso.Isso é feito por class_getInstanceVariable(), são as restrições class_addIvar() soltou, é uma função não documentada int ele objective-C 2.0 tempo de execução?Enquanto eu poderia implementar o meu próprio lado armazenamento para os dados de backup de minhas propriedades, prefiro usar o mecanismo que sintetizasse os acessores estão usando.

Foi útil?

Solução

Eu fui e olhei novamente a documentação agora, e eu acho que você está má interpretação-lo.Sintetizada ivars são criados em tempo de compilação, não em tempo de execução.

De acordo com o O objective-C 2.0 documentação:

Há diferenças no comportamento que dependem do tempo de execução (ver também "Diferenças de tempo de execução"):

Para o legado de tempos de execução, variáveis de instância já deve ser declarado no @bloqueio de interface.Se uma variável de instância com o mesmo nome e compatível com o tipo de propriedade existe, ele é usado—caso contrário, você obterá um erro do compilador.

Para os modernos, tempos de execução, variáveis de instância são sintetizados conforme necessário.Se uma variável de instância com o mesmo nome já existir, ele será usado.

Então tudo que você precisa fazer é declarar a variável de instância que você precisa, e o mesmo código irá funcionar em ambos os tempos de execução...

Outras dicas

O que você está procurando é o nome @Synthesized, como:

@synthesize name = _name;

...

- (NSString *) name {
    if (!name) {
        _name = @"Louis";
    }

    return _name;
}

Você adiciona propriedades em tempo de execução com o Protocolo NSKeyValuEcoding.

[myObject setValue:@"whatever" forKey:@"foo"];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top