2012-06-21 9 views
5

Mam krótkie pytanie dotyczące ARC w iOS. (Przepraszam, że zadawałem tak wiele pytań tego typu, ale jestem po prostu zakłopotany, jeśli chodzi o zarządzanie pamięcią). Ważne jest, aby pamiętać, że nigdy nie używałem starego systemu konserwacji pamięci (retain, release, assign ... itd.), Więc nie wiem, co oznaczają te terminy.Kiedy silne właściwości zostaną wydane w ARC w systemie iOS?

W tej chwili jestem zdezorientowany, jeśli chodzi o to, co muszę zrobić, aby upewnić się, że silne właściwości zostaną poprawnie zwolnione. Załóżmy na przykład, że robię aplikację szkolną, a mój obiekt School zawiera silne odwołania do właściwości do 5 różnych obiektów Child (nie w tablicy). Każdy obiekt Child ma silny wskaźnik (właściwość) do obiektu Book.

Jeśli usuniemy jeden z obiektów Child z mojej szkoły (powiedzmy, wprowadzając właściwość = nil lub zmieniając moją właściwość, aby wskazywać na nowy obiekt), czy jego Book zostanie poprawnie zwolniony? Co muszę zrobić, aby upewnić się, że tak właśnie jest? Czy muszę napisać self.myBook = nil w metodzie dealloc? Co jeśli Child był kontrolerem widoku, czy musiałbym napisać self.myBook = nil w metodzie viewDidUnload?

Jestem ukierunkowany tylko na iOS 5 (i wyżej), więc stary sposób zarządzania pamięcią nie ma dla mnie większego znaczenia.

+0

Sugeruję przeczytanie tego: http://clang.llvm.org/docs/AutomaticReferenceCounting.html –

+0

Dzięki za sugestię. Przyjrzę się temu. – Nosrettap

Odpowiedz

5

Jeśli usunąć jedną z Child obiektów z mojej szkoły (słownie dokonując jego property = nil lub zmieniając moją własność wskazać na nowego obiektu), będzie jej Book zostać prawidłowo zwolniony?

Tak, zostanie wydany, o ile nie ma innych silnych odniesień do niego.

Co muszę zrobić, aby upewnić się, że tak właśnie jest?

Nic w szczególności: ARC będzie zmniejszyć liczbę odniesienia obiektu po ustawieniu odniesienie do tego obiektu do nil, zobaczyć, że obiekt nie jest wymieniony, i przystąpić do usuwania go. Jest wystarczająco inteligentny, aby poradzić sobie z przedmiotami przywoływanymi z usuwanego obiektu, rekursywnie, więc nie ma zamiaru przeciekać żadnej pamięci.

Jedno trzeba się martwić o to referencje okrągłe: jeśli Book ma silną back-odniesienie do Child, albo zrobić to odwołanie weak lub jasne go w tym samym czasie, jak ustawić odniesienie Book do nil (druga opcja jest podatna na błędy, a zatem nie jest zalecana).

+0

Czy powiedziałbyś, że w przeważającej części, jedyny czas na użycie "słabych właściwości" dotyczy rynków zbytu i uniknięcia zależności kołowych? – Nosrettap

+0

@Nosrettap Unikanie odwołań cyklicznych i do pewnego stopnia buforowania to dwa "przypadki parasola" obejmujące wykorzystanie słabych właściwości. Ważnym specjalnym przypadkiem, o którym warto wspomnieć oddzielnie, są właściwości reprezentujące delegatów: z godnym uwagi wyjątkiem "CAAnimation", wszystkie właściwości delegatów są słabe, aby uniknąć tworzenia cykli zatrzymania. – dasblinkenlight

+0

Jeśli istnieje cykl referencyjny, nie może go "wyczyścić w -okrycie", ponieważ dealloc nigdy nie zostanie wywołany (chyba że jest to dealloc metody będącej właścicielem obu elementów cyklu) –

Powiązane problemy