2009-03-19 16 views
7

Wenn ich Klassenvariablen in Objective-C deklariere, wann wird der Speicher freigegeben?Objective-C Klassenvariablen: Wann wird Dealloc aufgerufen?

Wenn meine Schnittstelle ist:

@interface TestClass : NSObject 
{ 
} 

+ (NSString)instanceCount; 

@end 

Und in der Umsetzung, erkläre ich:

static NSString instanceCount; 

Wie löse ich diese Klassenstufe variabel? h. wann wird der Dealloc nach Klassenvariablen in Objective-C aufgerufen?

+3

Gerade kam diese Frage beim Lernen Obj-C. Apple scheint darauf hinzuweisen, dass es keine "Klassenvariable" gibt, und was Sie in der Schnittstelle definiert haben, ist eher eine Klasse * -Methode *, die von der statischen Variable getrennt ist und daher in der Implementierung definiert werden muss. Die statische Variable ist auf den Umfang der Implementierung * file * beschränkt, nicht auf die Klasse selbst. Vielleicht ist das ein kleiner Streit, aber es verwirrte mich für eine Sekunde: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html#//apple_ref/doc/ uid/TP30001163-CH11-TPXREF118 –

Antwort

10

Die kurze Antwort auf Ihre Frage lautet: "Wenn das Programm beendet wird."

Statische Variablen werden am Anfang Ihres Programms zugewiesen, bevor die main()-Funktion beginnt. Ebenso werden sie am Ende Ihres Programms veröffentlicht, kurz nachdem main() beendet wird. Diese Speicherverwaltung wird von der Objective-C-Laufzeit ausgeführt, und alles geschieht hinter den Kulissen.

Wenn Sie versuchen, dieses Verhalten zu überwachen, werden Sie wahrscheinlich nicht viel Glück haben. wenn Sie die folgenden in einer benutzerdefinierten Klasse haben, zum Beispiel, und verwendet dann die Klasse als statisches Mitglied einer anderen Klasse:

- (void)dealloc 
{ 
    NSLog(@"I am being deallocated"); 
    [super dealloc]; 
} 

würden Sie nie diese Meldung im Protokoll erscheinen sehen. Dafür gibt es mehrere Gründe. Eins, die Variablen, die NSLog() erfordert, wurden möglicherweise bereits im Rahmen der normalen Abschaltprozedur freigegeben. Und zweitens, weil das Laufzeitsystem einfach den gesamten verbleibenden Speicher in einer einzelnen Aufnahme freigeben kann, ohne sich darum zu kümmern, die Methoden dealloc aufzurufen.

Dies kann problematisch sein, wenn Ihre benutzerdefinierte Klasse in ihrer dealloc Methode etwas Wichtiges tut. Wenn dies der Fall ist, sollten Sie eine benutzerdefinierte cleanup Methode schreiben, die Sie für diese Objekte kurz vor dem Beenden des Programms aufrufen.

+0

ganz zu schweigen von der Tatsache, dass dealloc eine Instanzmethode ist und 0 oder 100 mal für die Klasse aufgerufen werden könnte – cobbal

+0

Hmm, ja, aber ich dachte an diese Methode in einem Objekt, das als verwendet wurde statisches Mitglied einer anderen Klasse. Das habe ich (hoffentlich) in meiner Antwort geklärt. Danke für das Aufzeigen! –

Verwandte Themen