Pregunta

He implementado un poco de código de uno de los muchos ejemplos de código de Apple, pero tengo algunos problemas, porque el atributo de retención de una de las propiedades no parece estar funcionando. Aquí está la declaración de propiedad:

@property (nonatomic, retain) EditingViewController *editingViewController;

Y aquí está el 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;
}

Entiendo que se supone que (retener) hace que el recuento de retenciones aumente en 1 en la asignación; sin embargo, el código falla a menos que lo haga envíe [aController retener] a mí mismo, o no lo haga enviar [una versión de Control]. ¿Qué me estoy perdiendo aquí?

¿Fue útil?

Solución

Cuando hace referencia a editingViewController , es equivalente a self- > editingViewController , es decir, un acceso a un ivar.

Si desea usar un getter o setter, debe usar self.editingViewController , o equivalentemente [self setEditingViewController: aController] .

Es por eso que prefiero usar un ivar con un nombre diferente a la propiedad, por ejemplo:

EditingViewController* i_editingViewController;

@property (nonatomic, retain) EditingViewController *editingViewController;

@synthesize editingViewController = i_editingViewController;

Entonces puedes escribir tu getzy perezoso como:

- (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (i_editingViewController == nil) {
        i_editingViewController = [[EditingViewController alloc] init];
    }
    return i_editingViewController;
}

o

- (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;
}

Probablemente usaría el método anterior (sin invocar al configurador) porque el valor de editingViewController (como lo ve cualquier observador) no ha cambiado realmente, pero de cualquier manera debería funcionar bien y el nombre diferente (para ivar y propiedad) ayuda a evitar la confusión o el mal uso accidental. También es un estímulo leve para usar la propiedad (ya que evita el prefijo ligeramente feo).

Tenga en cuenta que Apple se reserva el prefijo _, y que los setters y getters no deben usarse en las rutinas init / dealloc .

Otros consejos

Tiene que escribir self.editingViewController para usar la propiedad. Simplemente " editingViewController " es un acceso directo a la variable miembro de la Clase, mientras que self.editingViewController es equivalente a [self setEditingViewController: ...] y realizará el trabajo de retención / liberación apropiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top