Atributo de propriedade "manter" não parece estar funcionando?
-
06-07-2019 - |
Pergunta
Implementei um pouco de código a partir de uma das muitas Apple exemplos de código, mas eu estou tendo um pouco de dificuldade, porque a manter atributo de uma das propriedades não aparecem para trabalhar.Aqui está a declaração de propriedade:
@property (nonatomic, retain) EditingViewController *editingViewController;
E aqui está o código:
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (editingViewController == nil) {
EditingViewController *aController = [[EditingViewController alloc] init];
editingViewController = aController;
[aController release];
}
return editingViewController;
}
Eu entendo que (reter) é suposto para fazer a manter a contagem de aumentar em 1 de atribuição;no entanto, o código de falha, a menos que eu fazer enviar [aController manter] a mim mesmo, ou não enviar [aController release].O que estou ausente aqui?
Solução
Quando você faz referência a editingViewController
, ele é equivalente a self->editingViewController
, i.é.um acesso a uma ivar.
Se você quiser usar um getter ou setter, você precisa usar self.editingViewController
, ou equivalentemente [self setEditingViewController:aController]
.
É por isso que eu prefiro usar uma ivar com um nome diferente para a propriedade, por exemplo:
EditingViewController* i_editingViewController;
@property (nonatomic, retain) EditingViewController *editingViewController;
@synthesize editingViewController = i_editingViewController;
Em seguida, você pode escrever seu preguiçoso getter como:
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (i_editingViewController == nil) {
i_editingViewController = [[EditingViewController alloc] init];
}
return i_editingViewController;
}
ou
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (i_editingViewController == nil) {
EditingViewController *aController = [[EditingViewController alloc] init];
self.editingViewController = aController;
[aController release];
}
return i_editingViewController;
}
Eu provavelmente iria usar o primeiro método (não invocar o setter), porque o valor de editingViewController
(como pode ser visto por qualquer observador) não mudou, mas de qualquer forma deve funcionar bem e o nome diferente (por ivar e propriedade) ajudar a evitar a confusão ou acidental mal utilizados.É também um leve estímulo ao uso de sua propriedade (pois evita a pouco feio prefixo).
Observe que a Apple reserva-se o _ prefixo, e que setters e getters não deve ser usado na init
/dealloc
rotinas.
Outras dicas
Você tem que escrever self.editingViewController
Para usar a propriedade. Apenas "editingViewController
"É um acesso direto à variável do membro da classe, enquanto self.editingViewController
é equivalente a [Auto -SeteditingViewController: ...] e fará o trabalho de retenção/liberação apropriado.