Esto es una práctica común a menudo veo (incluyendo un libro de desarrollador de iPhone muy popular)iPhone Gestión de memoria y liberación
En el archivo .h:
@interface SomeViewController : UIViewController
{
UIImageView *imgView;
}
En algún lugar en el archivo .m:
imgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen]
applicationFrame]];
[imgView setImage:[UIImage imageNamed:@"someimage.png"]];
[self addSubview:imgView];
[imgView release];
Y después, vemos esto ...
- (void) dealloc
{
[imgView release];
[super dealloc];
}
Dado que imgView tiene una asignación y una liberación correspondientes, ¿es necesario el lanzamiento de imgView en dealloc?
¿Dónde está retenida la imgView por la llamada addSubview?
imgView no se lanzó demasiado pronto. Se está reteniendo por addSubview. Esta es una muy idioma común para liberar justo después de agregar a través de addSubview (o cualquier otra llamada que retenga, como pushViewController de UINavigationController). – Boon
Un método un poco más simple es asignar el ivar (imgView) directamente en lugar de usar self.imgView más tarde. Esto elimina la necesidad de [newImgView versión] más adelante en el código. – Sophtware
@boon Vaya, tiene razón, creo que debo haber leído mal el código original. En cualquier caso, almacenar un elemento en una variable de instancia después de haberlo liberado es un error, podría terminar escribiendo un código que envíe un mensaje al objeto después de que haya sido desasignado (aunque admito que es muy poco probable en este caso específico). –