2009-02-18 7 views
39

Kiedy deallocing do refrence widziałem release i dealloc wykorzystywane na przykładRóżnica między zwolnieniem i dealloc w Objective-C

-(void)dealloc 
{ 
    [foo release]; 
    [nar dealloc]; 

    [super dealloc]; 
} 

Moje pytanie brzmi: kiedy jest release być używane i kiedy jest dealloc być stosowane ?

Dzięki

+0

Jeśli nazwiesz '[self dealloc]' w definicji '-dealloc', to spowoduje to rekursję. Jesteś pewien, że kod jest poprawny? – codelogic

Odpowiedz

53

Nigdy zadzwonić dealloc wyjątkiem [super dealloc] na koniec dealloc metody w klasie. Metoda release rezygnuje z własności obiektu. Kiedy obiekt Cocoa nie ma już żadnych właścicieli, może zostać zwolniony - w takim przypadku zostanie automatycznie wysłany komunikat o następującej treści: dealloc.

Jeśli zamierzasz programować kakao, musisz przeczytać Memory Management Guidelines. Jest niesamowicie prosty, gdy przejdziesz przez początkowy garb, a jeśli nie zrozumiesz, co jest w tym dokumencie, będziesz miał mnóstwo subtelnych błędów.

+0

co z [self dealloc], jak pokazałem w tym przykładzie, czy naprawdę tego potrzeba? – hhafez

+6

Nie tylko jest to niepotrzebne, wywołanie [self dealloc] w metodzie dealloc tworzy nieskończoną pętlę. – Chuck

2

Instrukcja w twoim przykładzie jest wywoływana, gdy licznik zatrzymania obiektu staje się zerem (przez obiekt wysyłający komunikat zwolnienia).

Ponieważ nie jest już potrzebna, oczyszcza się wysyłając wiadomość o adresie release do obiektów, na których się trzyma.

1

Nigdy nie powinieneś jawnie nazywać dealloc (chyba że to [super deal] w metodzie dealloc, ale to jedyny wyjątek). Objective-C obsługuje zarządzanie pamięcią poprzez liczenie odwołań, więc powinieneś po prostu dopasować swoje alokacje/zachowuje się z wydaniami/autoreascjami i pozwolić obiektowi na dekonstrukcję.