Gdzieś czytałem, że - w zakresie niskich ostrzeżenia pamięci i zrezygnowania z niewidoczną widok z wszystkich jego subviews (= cała stalówka, jak sądzę), należy to zrobić:Dlaczego powinienem napisać [anView release], anView = nil; zamiast [wydanie anView] ;?
-(void)dealloc {
[anView release], anView = nil;
[someImageView release], someImageView = nil;
[super dealloc];
}
zamiast
-(void)dealloc {
[anView release];
[someImageView release];
[super dealloc];
}
Jaki jest powód, dla którego uziemienie tych wskaźników jest zerowe (= "brak obiektu"), po wywołaniu wersji? Niech zgadnę: jakaś inna metoda mogłaby -retainować widok z jakiegoś powodu (ktokolwiek na przykład, kiedy to może się zdarzyć?), Wtedy zdarzyło się coś, co zrobiłeśReceiveMemoryWarning, i zwolnisz cały widok nib +, który obecnie nie jest widoczny (np. w aplikacji multiview). Jak tylko użytkownik chce ponownie zobaczyć ten widok, szybko załadowałbyś stalówkę ponownie, a następnie: Ładuje wszystkie widoki, łączy wyjścia i BANG! Twój drugi widok jest teraz zawieszony bez wskaźnika gdzieś samotny w cegle pamięci, powodując tłusty i głęboki wyciek pamięci, aż do awarii aplikacji.
Dobrze/źle?
Nie. Jest to * wyraźnie zabronione * przez firmę Apple i jest dobrym sposobem na spowodowanie awarii w pewnych okolicznościach. Zobacz http://stackoverflow.com/questions/192721/why-shouldnt-i-use-obective-c-2-0-accessors-in-init-dealloc –
To połączenie ma dobry punkt, ale czy nadal jest zły pomysł, jeśli używasz go tylko do właściwości Readwrite, które są w pełni syntetyzowane? (co oznacza, że nie deklarujesz syntezowania dla właściwości i wciąż przesłonię gettera lub ustawiacza). – Kevlar
To prawdopodobnie dobrze, na razie, z w pełni zsyntetyzowanymi właściwościami. Ale Apple nie gwarantuje, że jest to dozwolone i nie zaleca tego, więc może to pęknąć w dowolnym przyszłym pakiecie SDK. –