Widziałem kod (prawdopodobnie własny przykładowy kod Apple) napisany w taki sposób, że uwalnia ivar w dealloc i ustawia właściwość w viewDidUnload.Czy konieczne jest zwolnienie ivar i ustawienie zsyntetyzowanego ivar na zero w tym samym czasie?
np.
- (void)viewDidUnload
{
self.navigationController = nil;
}
- (void)dealloc
{
[_navigationController release];
}
Dlaczego są one w dwóch miejscach? Ponadto, dlaczego ustawić zero w jednym i zwolnić w innym. Wygląda na to, że self.property = zero zajmowałoby się wszystkim, odkąd zwolniłoby i ustawiło wartość ivar na zero.
Dzięki, więc w tym przypadku kod viewDidUnload mógł użyć tego samego kodu jako dealloc do zwalniania obiektu, tj. [_navigationController release] zamiast ustawić go na zero, prawda? – Boon
Tak, ale nie rób tego. Użyj akcesora wszędzie z wyjątkiem -dealloc. Używanie akcesorów w -dealloc jest kontrowersyjne z przyczyn podanych przez Daniela (Apple również nie jest pewne, co zalecają). Po prostu przyzwyczajaj się do wypuszczania wszystkich swoich zachowanych ivarów w -określeniu. Nie zakładaj się, że możesz to zrobić za ciebie. A kiedy coś wypuścisz, ustaw go na zero. Znaczna część ObjC jest bez siatki bezpieczeństwa; dobre nawyki sprawiają, że programy działają, ponieważ kompilator cię nie uratuje. (OK, może Clang nareszcie nas uratuje, ale tylko użyje swojej mocy na dobre.) –