Ecco una pratica comune che vedo spesso (anche da un libro iPhone sviluppatore molto popolare)iPhone gestione della memoria e rilascio
Nel file .h:
@interface SomeViewController : UIViewController
{
UIImageView *imgView;
}
Da qualche parte nel file .m:
imgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen]
applicationFrame]];
[imgView setImage:[UIImage imageNamed:@"someimage.png"]];
[self addSubview:imgView];
[imgView release];
E più tardi, vediamo questo ...
- (void) dealloc
{
[imgView release];
[super dealloc];
}
Poiché imgView ha un allocazione e una release corrispondenti, è necessario il rilascio di imgView in dealloc?
Dove è rappresentato l'imgView trattenuto dalla chiamata ad addSubview?
imgView non è stato rilasciato troppo presto, è stato mantenuto da addSubview. idioma comune da rilasciare subito dopo l'aggiunta tramite addSubview (o qualsiasi altra chiamata che manterrà, come pushViewController di UINavigationController. – Boon
Un metodo leggermente più semplice consiste nell'assegnare direttamente ivar (imgView) invece di utilizzare self.imgView in seguito. Ciò elimina la necessità di [versione newImgView] più avanti nel codice. – Sophtware
@boon Oops, hai ragione - penso di aver letto male il codice originale. Ad ogni modo, memorizzare qualcosa in una variabile di istanza dopo averlo rilasciato è un errore, potresti finire per scrivere codice che invia un messaggio all'oggetto dopo che è stato deallocato (anche se ammetto che è molto improbabile in questo caso specifico). –