Por que não há necessidade de lançar uma tomada que está configurado com “Atribuir”?
-
03-07-2019 - |
Pergunta
Estive lendo que se eu tiver algo como isto:
@property (nonatomic, assign) UIView *anView;
Então eu não precisa se preocupar com o gerenciamento de memória. Eu não tenho que fazer [a liberação anView] no método -dealloc.
Por quê?
"Atribuir" apenas diz o compilador: "Ei, cara, esta propriedade não reter quaisquer cessionários ninguém para isso." E então você pode fazer
@synchronize anView;
eo compilador magicamente cria um getter e setter, onde o setter pode apenas parecer que:
- (UIView*) anView {
return anView;
}
eo Setter pode ser parecido com:
- (void) setAnView:(UIView*)newAnView {
anView = newAnView;
}
certo / errado? Se isso fosse certo, o setter não reivindica a propriedade da variável newAnView, uma vez que não é um "reter" propriedade. Ele só tem isso e atribui à variável de instância. Então, quando se considera a política de propriedade, não há necessidade para liberar a variável de instância anView na -dealloc. O objeto não ele próprio. Ist correto?
Solução
Sim, você está basicamente correta. Vamos supor que o coletor de lixo está fora (caso contrário, não importa de qualquer maneira).
Ao usar propriedades 'Atribuir', você não tem que liberar o objeto porque você nunca manteve-lo (alguém da responsabilidade).
Essencialmente, isso cria uma referência fraca - anView pode ser desalocada enquanto a propriedade ainda aponta para ele. Normalmente, você usaria 'Atribuir' para os tipos de dados primitivos, não para objetos.