Quais são as diferenças entre implementar um @property
com @dynamic
ou @synthesize
?
559
Quais são as diferenças entre implementar um @property
com @dynamic
ou @synthesize
?
O @synthesize gerará métodos getter e setter para sua propriedade. O @dynamic diz ao compilador que os métodos getter e setter são implementados não pela própria classe, mas em algum outro lugar (como a superclasse ou será fornecida em tempo de execução).
Os usos para @dynamic são, por exemplo, com subclasses de NSManagedObject
(CoreData) ou quando você deseja criar uma saída para uma propriedade definida por uma superclasse que não foi definida como uma saída.
O @dynamic também pode ser usado para delegar a responsabilidade de implementar os acessadores. Se você implementa os acessadores dentro da classe, normalmente não usa @dynamic.
Super classe:
@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;
Subclasse:
@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;
NSUnknownKeyException
erros com minha propriedade dinâmica quando removi a@synthesize
linha (o Xcode 3.2 estava me dando um erro porque eu não tinha ivar correspondente para minha @ propriedade). A adição@dynamic
corrigiu o problema - compila e roda bem agora. Obrigado!@property
itens que não possuem@synthesize
nem@dynamic
serão sintetizados automaticamente. Para cada propriedade, um ivar com um sublinhado à esquerda, por exemplo,_propertyName
será criado, juntamente com o getter e o setter apropriados.Dê uma olhada neste artigo ; sob o título "Métodos fornecidos em tempo de execução":
A
@synthesize
diretiva, por outro lado, gera os métodos de acessador para você em tempo de compilação (embora, conforme observado na seção "Misturando acessores sintetizados e personalizados", seja flexível e não gere métodos para você, se algum deles estiver implementado).fonte
Como outros já disseram, em geral você usa @synthesize para que o compilador gere os getters e / ou configurações para você e @dynamic se você mesmo os escrever.
Há outra sutileza ainda não mencionada: @synthesize permitirá que você forneça uma implementação, seja de um getter ou de um setter. Isso é útil se você deseja implementar o getter apenas para uma lógica extra, mas permite que o compilador gere o setter (que, para objetos, geralmente é um pouco mais complexo de se escrever).
No entanto, se você escrever uma implementação para um acessador @ synthesize'd, ainda deverá ser apoiada por um campo real (por exemplo, se você escrever,
-(int) getFoo();
deverá ter umint foo;
campo). Se o valor estiver sendo produzido por outra coisa (por exemplo, calculado a partir de outros campos), você deverá usar @dynamic.fonte
@dynamic
se você mesmo escrever" Não, você NÃO usa dinâmico se você mesmo os escrever.@dynamic
desativa a verificação do compilador para garantir que você os implementou. Se você os implementou, deseja que o compilador verifique.@dynamic é normalmente usado (como foi dito acima) quando uma propriedade está sendo criada dinamicamente em tempo de execução. O NSManagedObject faz isso (por que todas as suas propriedades são dinâmicas) - que suprimem alguns avisos do compilador.
Para obter uma boa visão geral de como criar propriedades dinamicamente (sem NSManagedObject e CoreData :, consulte: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#// apple_ref / doc / uid / TP40008048-CH102-SW1
fonte
aqui está um exemplo de @dynamic
fonte
Conforme a documentação:
https://developer.apple.com/library/mac/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html
@dynamic informa ao compilador que os métodos acessadores são fornecidos em tempo de execução.
Com um pouco de investigação, descobri que o fornecimento de métodos de acessor substitui a diretiva @dynamic.
O @synthesize diz ao compilador para criar esses acessadores para você (getter e setter)
@property informa ao compilador que os acessadores serão criados e que podem ser acessados com a notação de ponto ou [mensagem de objeto]
fonte
Uma coisa a acrescentar é que, se uma propriedade for declarada como @dynamic, ela não ocupará memória (confirmei com o instrumento de alocação). Uma conseqüência é que você pode declarar propriedade na categoria de classe.
fonte
Conforme a documentação da Apple.
Você usa a
@synthesize
instrução no bloco de implementação de uma classe para informar ao compilador para criar implementações que correspondem à especificação que você forneceu na@property
declaração.Você usa a
@dynamic
instrução para instruir o compilador a suprimir um aviso se ele não conseguir encontrar uma implementação dos métodos de acessador especificados por uma@property
declaração.Mais informações:-
https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html
fonte