2009-02-18 5 views
39

Wenn deallocing ein refrence ich release und dealloc gesehen haben wird zum Beispiel verwendetUnterschied zwischen Freisetzung und dealloc in Objective-c

-(void)dealloc 
{ 
    [foo release]; 
    [nar dealloc]; 

    [super dealloc]; 
} 

Meine Frage ist, wenn release verwendet werden soll, und wenn dealloc verwendet werden soll, ?

Dank

+0

Wenn Sie '' self dealloc] 'innerhalb der' -dealloc' Definition aufrufen, wird dies zu einer Rekursion führen. Sind Sie sicher, dass der Code korrekt ist? – codelogic

Antwort

53

ruft nie dealloc außer als [super dealloc] am Ende dealloc Methode der Klasse. Die release Methode gibt den Besitz eines Objekts auf. Wenn ein Cocoa-Objekt keine Eigentümer mehr hat, kann es freigegeben werden - in diesem Fall wird automatisch eine dealloc Nachricht gesendet.

Wenn Sie Cocoa programmieren möchten, müssen Sie die Memory Management Guidelines lesen. Es ist unglaublich einfach, wenn du über den anfänglichen Buckel kommst, und wenn du nicht verstehst, was in diesem Dokument steht, wirst du viele kleine Fehler haben.

+0

Was ist mit [self dealloc], wie ich im Beispiel gezeigt habe, ist das wirklich nötig? – hhafez

+6

Nicht nur ist es unnötig, den Aufruf von [self dealloc] in Ihrer Dealloc-Methode erstellt eine Endlosschleife. – Chuck

2

Die dealloc-Anweisung in Ihrem Beispiel wird aufgerufen, wenn die Retain-Anzahl des Objekts Null wird (durch ein Objekt, das eine Freigabemeldung sendet).

Da es nicht mehr benötigt wird, säubert es sich selbst, indem es eine release Nachricht an die Objekte sendet, an denen es sich festhält.

1

Sie sollten Dealloc niemals explizit aufrufen (außer es ist [Super Dealloc] innerhalb der Dealloc-Methode, aber das ist die einzige Ausnahme). Objective-C übernimmt die Speicherverwaltung über die Referenzzählung, daher sollten Sie Ihre Alloces/Memaes lediglich mit Releases/Autoreleases abgleichen und das Objekt dekonstruieren lassen.