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ń retain
release
, 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!!!
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
Świetna odpowiedź !!!. Dziękuję bardzo. –