As propriedades em Objective-C 2.0 requerem que uma variável de instância correspondente seja declarada? Por exemplo, estou acostumado a fazer algo assim:
MyObject.h
@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
MyObject.m
@implementation
@synthesize name;
@end
No entanto, e se eu fizesse isso em vez disso:
MyObject.h
@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end
Isso ainda é válido? E é de alguma forma diferente do meu exemplo anterior?
Respostas:
Se você estiver usando o Modern Objective-C Runtime (iOS 3.x ou superior, ou Snow Leopard de 64 bits ou superior), não necessário definir ivars para suas propriedades em casos como este.
Quando você
@synthesize
a propriedade, o ivar na verdade será sintetizado também para você. Isso contorna o cenário "frágil-ivar". Você pode ler mais sobre isso no Cocoa with Lovefonte
Em sua interface, você pode declarar formalmente uma variável de instância entre as chaves, ou por meio de
@property
fora das chaves, ou ambos. De qualquer forma, eles se tornam atributos da classe. A diferença é que, se você declarar@property
, poderá implementar o using@synthesize
, que codifica automaticamente seu getter / setter para você. O setter autocodificador inicializa inteiros e flutua para zero, por exemplo. SE você declarar uma variável de instância e NÃO especificar uma correspondente@property
, não poderá usar@synthesize
e deverá escrever seu próprio getter / setter.Você sempre pode substituir o getter / setter codificado automaticamente especificando o seu próprio. Isso geralmente é feito com a
managedObjectContext
propriedade que é carregada lentamente. Assim, você declara seumanagedObjectContext
como uma propriedade, mas também escreve um-(NSManagedObjectContext *)managedObjectContext
método. Lembre-se de que um método, que tem o mesmo nome de uma variável / propriedade de instância, é o método "getter".O
@property
método de declaração também permite outras opções, comoretain
ereadonly
, que o método de declaração de variável de instância não permite. Basicamente,ivar
é a maneira antiga, e@property
estende-a e torna-a mais sofisticada / fácil. Você pode se referir a qualquer um deles usando o self. prefixo, ou não, não importa, desde que o nome seja único para aquela classe. Caso contrário, se sua superclasse tiver o mesmo nome de uma propriedade que você, você terá que dizer self.name ou super.name para especificar de qual nome está falando.Assim, você verá cada vez menos pessoas declarando
ivar
s entre colchetes e, em vez disso, passar a apenas especificar@property
e depois fazer@synthesize
. Você não pode fazer@synthesize
em sua implementação sem um correspondente@property
. O Sintetizador só sabe que tipo de atributo é a partir da@property
especificação. A instrução de síntese também permite renomear propriedades, para que você possa se referir a uma propriedade por um nome (abreviação) dentro do seu código, mas fora do arquivo .h use o nome completo. No entanto, com o autocomplete muito legal que o XCode tem agora, isso é menos uma vantagem, mas ainda está lá.Espero que isso ajude a esclarecer toda a confusão e desinformação que está circulando por aí.
fonte
@property
, e não usar@synthesize
e não implementá-los sozinho. O compilador será automáticosynthesize
para você, sem ter que escrever mais isso.funciona dos dois modos, mas se você não os declarar entre chaves, você não verá seus valores no depurador no xcode.
fonte
Da documentação:
Em geral, o comportamento das propriedades é idêntico em tempos de execução modernos e legados (consulte “Versões e plataformas de tempo de execução” no Objective-C Runtime Programming Guide). Há uma diferença fundamental: o tempo de execução moderno oferece suporte à síntese de variáveis de instância, enquanto o tempo de execução legado não.
Para que @synthesize funcione no tempo de execução legado, você deve fornecer uma variável de instância com o mesmo nome e tipo compatível da propriedade ou especificar outra variável de instância existente na instrução @synthesize. Com o tempo de execução moderno, se você não fornecer uma variável de instância, o compilador adiciona uma para você.
fonte
Se você estiver usando o XCode 4.4 ou posterior, ele gerará um código de síntese de variáveis de instância para você.
Você apenas tem que declarar propriedades como abaixo; ele irá gerar código de síntese e código de declaração de variável de instância para você.
ele irá gerar código de síntese como
e você pode acessar a variável de instância usando _name, é semelhante a declarar
mas se você declarar propriedade somente leitura, como
vai gerar código
ou
Portanto, você deve acessar o nome da variável instantânea sem o prefixo "_" de qualquer maneira que possa escrever seu próprio código de síntese, então o compilador irá gerar o código para você. você pode escrever
fonte
A Linguagem de Programação Objective-C: Diretivas de Implementação de Propriedade
fonte