2009-11-05 14 views
6

Zastanawiam się, jaka jest różnica między zwolnieniem a dealokacją? Po przeczytaniu, zasady zarządzania pamięcią (zobacz poniżej), myślę, że przez większość czasu będę używać wydania. Jednak chciałem wiedzieć, co zrobić dla nieruchomości.iPhone SDK: Dealloc vs. Release?

@property (zachowują) ....

Używam dealloc ale po przeczytaniu tego artykułu nie jestem pewien, że jest prawidłowa.

Przejmujesz własność obiektu, jeśli utworzysz go za pomocą metody, której nazwa zaczyna się od "alloc" lub "new" lub zawiera "copy" (na przykład alloc, newObject lub mutableCopy), lub jeśli ją wysyłasz zachować wiadomość. Jesteś odpowiedzialny za zrzeczenie się własności posiadanych obiektów za pomocą wydania lub autoreakcji. Za każdym razem, gdy otrzymasz obiekt, nie możesz go zwolnić.

Odpowiedz

21

Nigdy nie należy dzwonić pod numer dealloc na temat innych niż super.

Jedyny przypadek, w którym wywołasz dealloc, jest metodą dealloc niestandardowego odziedziczonego obiektu i będzie to [super dealloc].

Kiedy hrabia zachować przedmiotu spada do zera, dealloc zostanie automatycznie wezwał do ciebie, tak aby zarządzać pamięć prawidłowo, trzeba zadzwonić retain i release gdy właściwe.

Jeśli nie jest to dla Ciebie jasne lub chcesz uzyskać szczegółowe informacje na temat zarządzania pamięcią w kakao, przeczytaj artykuł Memory Management Programing Guide.

+0

Dziękuję za wyjaśnienie. –

+1

dzięki Bogu ARC wyszedł! –

5

Nigdy nie wywołujej bezpośrednio dealloc. Jest on wywoływany przez system, gdy retainCount obiektu przechodzi do 0. Za każdym razem zrobić zachować The retainCount jest zwiększany o 1. Za każdym razem robisz uwalnianie, zostaje zmniejszona. W ten sposób, poprzez zrównoważenie Twój zachowuje i uwolnień, upewnić się, niż gdy retainCount dostaje się do 0, dealloc zostanie automatycznie nazywa, a obiekt uwolniony.

Jak zauważył Ben S, tylko czas i miejsce nazwałbyś dealloc jest w dealloc metody odziedziczonej obiektu.

0

Podczas korzystania z @property(retain), a następnie @synthesize do generowania kodu właściwości, nie ma potrzeby ręcznego zarządzania pamięcią we właściwości. Inne odpowiedzi są poprawne, ponieważ nie powinieneś używać dealloc, z wyjątkiem własnego nadpisania klasy nadrzędnej dealloc.