Quando eu aprendi sobre programação iOS (eu acredito que isso foi a partir das palestras pré-ARC de Stanford), nós sempre sintetizamos propriedades como esta:
@synthesize myProperty=_myProperty
No entanto, parece que esta tem sido a comportamento padrão por um tempo. Então, omitir essa afirmação é exatamente o mesmo que deixar em branco.
Minha pergunta é: dado esse comportamento padrão, quais são alguns exemplos práticos onde nós realmente queremos usar uma instrução @synthesize?
Respostas:
5 para resposta № 1Com o iOS 6, o compilador LLVM veio com algo chamado "autossíntese de propriedade". Basicamente, isso significa que o compilador irá adicionar um @synthesize
para cada @property
Veja da seguinte forma:
@synthesize propertyName = _propertyName;
isto é, criará um ivar prefixado com sublinhado e gerará o getter & setter usando este ivar.
Existe apenas uma razão para usar @synthesize
explicitamente e a razão é renomear o ivar ou, por exemplo, usar o mesmo ivar para duas propriedades diferentes.
Observe também que, em alguns casos, você precisa usar @dynamic
para impedir a síntese. Normalmente, quando você sabe que os métodos (getter ou setter) já estão definidos em algum lugar, mas o compilador não os conhece.
Não há implicações de memória na autossíntese, portanto, ela não está conectada ao ARC.
E se eu implementar manualmente getter e setter?
Se a propriedade for readwrite e você implementartanto setter quanto getter ou se a propriedade for readonly e você implementar o getter, nada será sintetizado. A síntese refere-se à definição automática dos dois métodos. Por que o compilador deve sintetizar algo que já está lá? Se a implementação manual precisa de um ivar, apenas declare o ivar, você não precisa adicionar @synthesize
apenas para adicionar um ivar (embora você possa).
EDITAR
Eu esqueci um motivo ao usar @synthesize
é necessário e é quando se implementa uma propriedade declarada em um protocolo. Tal propriedade não será autossintetizada. Um exemplo típico é [UIApplicationDelegate window]
.
2 para resposta № 2
@synthesize in objective-c apenas implementa setters e getters de propriedades:
- (void)setCoolWord:(NSString *)coolWord {
_coolWord = coolWord;
}
- (NSString *)coolWord {
return _coolWord;
}
É verdade com o Xcode 4 que isso é implementadopara você (o iOS6 requer o Xcode 4). Tecnicamente ele implementa @synthesize coolWord = _coolWord (_coolWord é a variável de instância e coolWord é a propriedade).
Para acessar essas propriedades, use self.coolWord para definir self.coolWord = @ "YEAH!"; e ficando NSLog(@"%@", self.coolWord);
Observe também que tanto o setter quanto o getter ainda podem ser implementados manualmente. Se você implementar tanto o setter e getter que você precisa incluir manualmente @synthesize coolWord = _coolWord;
Com a síntese automática no iOS6, não é maisÉ necessário declarar especificamente os ivars de apoio ou escrever a instrução @synthesize. Quando o compilador encontrar uma instrução @property, fará o mesmo em nosso nome usando as diretrizes que acabamos de analisar. Então, tudo o que precisamos fazer é declarar uma propriedade como esta:
@property (nonatomic, strong) NSString *abc;
e no iOS 6, @synthesize abc = _abc, será adicionado automaticamente em tempo de compilação.
2 para resposta № 3
Você não precisa usar isso. Simplesmente declare suas propriedades públicas como esta em seu .h:
@property (nonatomic, strong/weak/assign) MyType *propertyName;
Mais detalhes sobre o ARC Aqui
Nota adicional :
@synthesize
foi usado para vincular uma propriedade a uma variável de classe interna. É feito automaticamente com o ARC.