2009-11-03 8 views
8

Rozwijam się z obiektywnym C i ramy Cocoa już od dłuższego czasu. Jednak nadal nie jest dla mnie całkowicie jasne, kiedy mam ustawić odniesienia do obiektu na zero. Wiem, że zaleca się to zrobić tuż przed zwolnieniem obiektu, który ma delegata i powinieneś to zrobić również w metodzie viewDidUnload dla zachowanych subskrybentów. Ale dokładnie, kiedy należy to zrobić i dlaczego ?. Co dokładnie osiąga? Z góry dziękuję.Obiektyw C iPhone, kiedy ustawić odniesienia do obiektu na zero

-Oscar

Odpowiedz

40

Powiedzmy, że masz wskaźnik myView zdefiniowane w interfejsie klasy:

@interface MyClass { 
    UIView *myView; 
} 

@end 

Następnie w kodzie, w pewnym momencie, może zwolnić tej zmiennej:

[myView release]; 

Po wykonaniu tej czynności wskaźnik nie będzie wskazywał na zero, ale wskaże adres pamięci obiektu, który może już nie istnieć (s po prostu to wypuściłeś). Tak więc, jeśli zdarzy ci się coś zrobić po tym, jak:

[myView addSubview:otherView]; 

dostaniesz błąd.

Jeśli, z drugiej strony, to zrobić:

[myView release]; 
myView = nil; 
... 
[myView addSubview:otherView]; 

wywołanie addSubview nie będzie miało żadnego negatywnego wpływu, ponieważ wiadomości do zera są ignorowane.

Jako następstwo, można zobaczyć propozycje wykorzystania retain właściwości, takie jak:

@property(retain) UIView *myView; 

a następnie w kodzie, po prostu zrobić:

self.myView = nil; 

Dzięki temu, że zsyntetyzowany akcesor zwolni stary obiekt i ustawi odwołanie do zera w jednym wierszu kodu. Może się to przydać, jeśli chcesz się upewnić, że wszystkie właściwości są zwolnione i ustawione na zero.

Jedną rzeczą, której nigdy nie wolno zapomnieć, jest to, że zarządzanie pamięcią odbywa się za pomocą wywołań retainrelease, a nie poprzez przypisywanie zer. Jeśli masz obiekt z zachowaną liczbą 1 i przypisujesz zero do jego jedynej zmiennej, będziesz przeciekać pamięć:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)]; 
view = nil; 
// You just leaked a UIView instance!!! 
+0

Każdy początkujący programista kakao powinien to przeczytać. Czytałem dokumenty Kochana, Hillegassa i Apple'a, a zrozumienie niektórych z opisanych tutaj koncepcji pgb zajęło mi prawie 6 miesięcy. Teraz wydaje mi się to oczywiste, ale na pewno nie było wcześniej. głosuj ++ – refulgentis

+0

Świetna odpowiedź !!!. Dziękuję bardzo. –