2010-08-19 15 views

Antwort

16

Ja, es kommt absolut auf, wenn [super dealloc] aufgerufen wird. Sobald [super dealloc] aufgerufen wird, können Sie nicht mehr auf die NSObject (oder was auch immer Ihre Stammklasse ist) Maschinen ordnungsgemäß funktionieren. Danach sollte Ihre super-Klasse '-dealloc Methode ihre Superklasse' usw. aufrufen, bis die Root-Klasse '-dealloc Methode aufgerufen wird. Zu diesem Zeitpunkt ist alles, was diese Klassen für ihre Arbeit zugewiesen haben, möglicherweise weg und Sie befinden sich in undefiniertem Gebiet, wenn Sie versuchen, etwas davon zu verwenden.

Ihre -dealloc Methode sollte immer aussehen wie

- (void)dealloc 
{ 
    // release my own stuff first 

    [super dealloc]; 
} 
+0

danke für die beschreibende Antwort! nur neugierig, kann dies einen Fehler KERN_PROTECTION oder KERN_INVALID_ADDRESS verursachen? –

+1

@Sheehan Alam: NSObjects 'dealloc' befreit das Objekt. Der Zugriff auf "self", nachdem es ausgeführt wurde, ist genauso wie der Zugriff auf freigegebenen Speicher - es könnte einen Fehler verursachen oder viel seltsamere Dinge verursachen. – Chuck

+1

@Sheeham, Ja. Das ist eine Möglichkeit. –

13

Ja. Letzte. Immer.

+2

Wenn Sie [Super Dealloc] verwenden; Stammobjekt wird zerstört. Wenn Sie einige Daten verwenden, die im Basisobjekt deklariert sind, führt dies zu einem Absturz. Sie sollten es zuletzt anrufen – Felics

4

Ja, [super dealloc] immer letzte Mal gewesen sein muss, wie oben gesagt, weil Referenzierung self oder andere Einbauten der Regel als selbstverständlich angesehen wird nicht funktionieren, und zum Absturz bringen können, wie sagte auch oben. Ein weiterer Grund, der oben nicht erwähnt wurde, ist, dass die iavar in dem Stück Speicher sind, auf den self zeigt. Wenn Sie also nach ([super dealloc]) mit (wie der Veröffentlichung) diese Dinge tun würden, würden Sie den Speicher freigeben.

Ich sagte 'may crash' oben, weil wenn Sie dies falsch tun neigt es tatsächlich nicht zum Absturz, was Sinn macht in Anbetracht der Speicher wird nicht überschrieben, bis es wiederverwendet wird. Dies macht es umso schlimmer, weil Sie möglicherweise einen Fehler haben, der nur manchmal auftritt, so dass es besonders schwer zu finden ist, falls es in Ihrem Gesicht explodiert.

Other than that, sind Sie völlig in Ordnung, wenn Sie eine lokale Variable veröffentlicht seine oder Dingsbums nach [super dealloc], und Sie können, wenn Sie wirklich wollen, etwas tun, wie

id local = ivar; 
[super dealloc]; 
[local release]; 

sicher, aber in der Interesse der Konsistenz, nicht.

In Summe, ja, [super dealloc]muss die letzte Sache in -dealloc sein.

Verwandte Themen