2009-03-19 15 views
7

Jeśli zadeklaruję zmienne klasy w Objective-C, kiedy pamięć zostanie zwolniona?zmienne klasy obiekt-c: kiedy wywoływana jest dealloc?

Jeśli mój interfejs jest:

@interface TestClass : NSObject 
{ 
} 

+ (NSString)instanceCount; 

@end 

I w realizacji, oświadczam:

static NSString instanceCount; 

Jak mogę zwolnić tę zmienną poziomu klasy? tj. kiedy dealloc wymaga zmiennych klasy w Objective-C?

+3

Właśnie natknąłem się na to pytanie podczas nauki Obj-C. Apple wydaje się sugerować, że nie ma czegoś takiego jak "zmienna klasy", a to, co zdefiniowałeś w interfejsie, jest raczej metodą * klasy *, która jest oddzielna od zmiennej statycznej i dlatego musi być zdefiniowana w implementacji. Zmienna statyczna jest ograniczona do zakresu pliku * implementacji *, a nie samej klasy. Może to drobny błąd, ale pomieszało mi to przez chwilę: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html#//apple_ref/doc/ uid/TP30001163-CH11-TPXREF118 –

Odpowiedz

10

Krótka odpowiedź na Twoje pytanie brzmi: "kiedy program zostanie zamknięty."

Zmienne statyczne są przydzielane na samym początku programu, zanim rozpocznie się funkcja main(). Podobnie, zostaną one wypuszczone na samym końcu twojego programu, krótko po wyjściu main(). Zarządzanie pamięcią jest obsługiwane przez środowisko wykonawcze Objective-C i dzieje się tak za kulisami.

Jeśli próbujesz monitorować to zachowanie, prawdopodobnie nie będziesz miał szczęścia. Na przykład, jeśli nie następujących w klasie niestandardowej, a następnie użył tej klasy jako statyczne członka innej klasy:

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

Nigdy nie zobaczyć ten komunikat pojawia się w dzienniku. Istnieje kilka powodów takiego stanu rzeczy. Po pierwsze, zmienne, które wymagają NSLog(), mogły już zostać zwolnione w ramach zwykłej procedury zamykania. I dwa, ponieważ system uruchomieniowy może po prostu zwolnić całą pozostałą pamięć w jednym ujęciu, bez konieczności zawracania sobie głowy metodami.

Może to być problematyczne, jeśli twoja niestandardowa klasa robi coś ważnego w metodzie dealloc. W takim przypadku rozważ napisanie niestandardowej metody, którą wywołasz dla tych obiektów tuż przed wyjściem programu.

+0

nie wspominając o tym, że dealloc jest metodą instancji i może zostać wywołany 0 lub 100 razy dla klasy – cobbal

+0

Hmm, tak, ale myślałem o tej metodzie w obiekcie, który był używany jako statyczny członek innej klasy. Mam (mam nadzieję) to wyjaśniłem w mojej odpowiedzi. Dziękuję za wskazanie tego! –