Hier ist eine gängige Praxis sehe ich oft (auch von einem sehr beliebten iPhone-Entwicklerbuch)iPhone Memory Management und Loslassen
In der H-Datei:
@interface SomeViewController : UIViewController
{
UIImageView *imgView;
}
Irgendwo in der .m-Datei:
imgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen]
applicationFrame]];
[imgView setImage:[UIImage imageNamed:@"someimage.png"]];
[self addSubview:imgView];
[imgView release];
Und später, sehen wir diese ...
- (void) dealloc
{
[imgView release];
[super dealloc];
}
Da imgView eine passende Zuordnung und Freigabe hat, ist die Freigabe von imgView in dealloc notwendig?
Wo wird der vom addSubview-Aufruf beibehaltene imgView berücksichtigt?
imgView wird nicht zu früh freigegeben. Es wird von addSubview beibehalten. Dies ist ein sehr Das allgemeine Idiom wird direkt nach dem Hinzufügen über addSubview (oder alle anderen Aufrufe, die beibehalten werden, z. B. PUSHViewController von UINavigationController) freigegeben. – Boon
Eine etwas einfachere Methode besteht darin, den ivar (imgView) direkt zuzuweisen, anstatt später self.imgView zu verwenden. Dies beseitigt die Notwendigkeit von [newImgView release] später im Code. – Sophtware
@boon Ups, du hast recht - ich denke, ich muss den Originalcode falsch gelesen haben. Auf jeden Fall ist es ein Fehler, etwas in einer Instanzvariablen zu speichern, nachdem Sie es freigegeben haben. Sie könnten schließlich Code schreiben, der eine Nachricht an das Objekt sendet, nachdem es freigegeben wurde (obwohl ich zugeben muss, dass dies in diesem speziellen Fall sehr unwahrscheinlich ist). –