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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top