Angenommen, Sie haben einen Zeiger myView
die in der Schnittstelle Ihrer Klasse definiert sind:
@interface MyClass {
UIView *myView;
}
@end
In Ihrem Code können Sie dann irgendwann diese Variable freigeben:
[myView release];
Nachdem Sie das getan haben, myView
zeigt der Zeiger nicht auf nil, sondern auf eine Speicheradresse eines Objekts, das möglicherweise nicht mehr existiert (da Sie es gerade freigegeben haben). Wenn Sie also danach etwas tun, wie z.B.:
[myView addSubview:otherView];
erhalten Sie eine Fehlermeldung.
Wenn Sie dies hingegen tun:
[myView release];
myView = nil;
...
[myView addSubview:otherView];
die Aufforderung an addSubview
wird keine negativen Auswirkungen haben, da Meldungen mit dem Wert Null werden ignoriert .
Als logische Folge werden Sie vielleicht Vorschläge zur Verwendung von retain
Eigenschaften, wie zum Beispiel:
@property(retain) UIView *myView;
und dann im Code, einfach tun:
self.myView = nil;
Auf diese Weise gibt der synthetische Accessor das alte Objekt frei und setzt den Verweis auf nil in einer einzigen Codezeile. Dies kann sich als nützlich erweisen, wenn Sie sicherstellen wollen, dass alle Ihre Eigenschaften sowohl freigegeben als auch auf null gesetzt werden.
Eine Sache, die Sie nie vergessen dürfen, ist, dass die Speicherverwaltung mit Hilfe von retain
release
Aufrufen und nicht durch die Zuweisung von nil. Wenn Sie ein Objekt mit einem Retain Count von 1 haben und dessen einziger Variable nil zuweisen, geht Speicher verloren:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
view = nil;
// You just leaked a UIView instance!!!