/ / Por que usar instruções @synthesize - ios, objective-c, properties

Por que usar instruções @synthesize - ios, objective-c, properties

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 № 1

Com 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.