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.
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 –