8 Stimmen

Objective C iPhone, wenn Objektreferenzen auf Null gesetzt werden sollen

Ich entwickle seit geraumer Zeit mit Objective C und dem Cocoa Framework. Es ist mir aber immer noch nicht ganz klar, wann ich Objektreferenzen auf null setzen soll. Ich weiß, dass es empfohlen wird, dies direkt vor der Freigabe eines Objekts zu tun, das einen Delegaten hat, und man sollte dies auch in der viewDidUnload-Methode für zurückbehaltene Unteransichten tun. Aber wann genau sollte man das tun und warum? Was wird dadurch genau erreicht? Ich danke Ihnen im Voraus.

-Oscar

41voto

pgb Punkte 24353

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!!!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X