2011-08-17 9 views

Odpowiedz

16

Nigdy nie wysyła się bezpośrednio wiadomości dealloc. Zamiast tego, metoda dealloc obiektu jest wywoływana pośrednio poprzez metodę protokołu NSObject (jeśli komunikat zwolnienia powoduje, że licznik zatrzymania odbiornika staje się 0). Więcej informacji na temat korzystania z tych metod można znaleźć w Przewodniku programowania zarządzania pamięcią.

podklasy musi wdrożyć własne wersje dealloc aby umożliwić uwolnienie dodatkowej pamięci zużywanej przez obiekt, taki jak dynamicznie przydzielonego przechowywania danych lub zmiennych instancji obiektów należących do dealokowane obiektu. Po przeprowadzeniu dealokacji specyficznej dla klasy, metoda podklasy powinna zawierać wersje superklasy dealloc poprzez komunikat do super:

Ważne: Należy zwrócić uwagę, że po zakończeniu aplikacji obiekty mogą nie otrzymać komunikatu dealloc , ponieważ pamięć procesu jest automatycznie usuwane przy wyjściu - jest bardziej wydajne po prostu, aby system operacyjny mógł wyczyścić zasoby, niż wywołać wszystkie metody zarządzania pamięcią . Z tego i innych powodów, nie powinien zarządzać ograniczonych zasobów w dealloc

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc]; 
    } 
    } 
1

Środowisko wykonawcze zrobi to za ciebie, gdy obiekt nie jest już potrzebny (co również decyduje środowisko wykonawcze). Tylko upewnij się, że prawidłowo zachowujesz i zwalniasz. Nie wywołuj dealloc na innych obiektach.

2

dealloc nazywa wskutek memory management. Gdy obiekt "retainCount" osiągnie 0, wiadomość dealloc jest automatycznie wysyłana do tego obiektu.

Nigdy nie należy wywoływać dealloc na obiektach, chyba że jest to połączenie z [super dealloc]; na końcu nadpisanej dealloc.

-(void)dealloc 
{ 
    [ivar release]; //Release any retained variables before super dealloc 

    [super dealloc]; //Only place in your code you should ever call dealloc 
} 

I według -[NSObject dealloc] discussion

nigdy wysłać wiadomość dealloc bezpośrednio. Zamiast tego metoda dealloc obiektu jest wywoływana pośrednio za pomocą metody protokołu NSObject (jeśli komunikat o zwolnieniu skutkuje uzyskaniem zliczenia odbiornika z wynikiem 0). Zobacz Memory Management Programming Guide dla więcej szczegółów na temat korzystania z tych metod.

5

Wyobraźmy sobie, że -release jest realizowany w NSObject tak:

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc] 
    } 
} 

Jestem pewien, że jest to trochę bardziej skomplikowane, ale odpowiedź na to pytanie jest to, że sam obiekt wezwie -dealloc gdy jest jego licznik zatrzymania spada do zera. Jednak twoja niestandardowa klasa odziedziczy to zachowanie z NSObject. Nigdy nie będziesz musiał wywoływać - dealokować siebie w kodzie, który piszesz; zawsze będzie automatycznie, gdy obiekt zostanie prawidłowo zwolniony.

+0

Mam nadzieję, że to ciało metody powinno znajdować się pod "zwolnieniem", a nie "zachować" – Saran

+0

@saran, masz absolutną rację. Mój głupi błąd; dzięki za złapanie go. – Caleb

+1

Naprawdę ładna odpowiedź.i dać odpowiedź powyżej, ale myślę, że twoja odpowiedź jest najlepsza w praktyczny sposób .. – PJR

Powiązane problemy