2009-04-24 16 views

Odpowiedz

4

Myślę, że podczas pracy z obiektami prawie zawsze używałbyś retain zamiast przypisywania i podczas pracy z prymitywnymi typami, strukturami, itp. Używałbyś przypisania (ponieważ nie możesz zachować nie-obiektów). Dzieje się tak, ponieważ chcesz, aby obiekt z właściwością decydował, kiedy jest wykonywany z obiektem, a nie czymś innym. Przewodnik zarządzania pamięcią firmy Apple podaje:

Są chwile, kiedy nie chcesz, aby odebrany obiekt został usunięty; dla przykładu, może być konieczne buforowanie obiektu w zmiennej instancji. W tym przypadku tylko wiesz, kiedy obiekt nie jest już potrzebny, więc musisz potrzebować mocy, aby upewnić się, że obiekt nie zostanie usunięty, podczas gdy użytkownik nadal używa go. Robi się to z zachowaniem komunikatu zatrzymania , który pozostaje w mocy: oczekującej autoreakcji (lub zwalnia wiadomość o późniejszym wydaniu lub autoreasadzie ). Zachowując obiekt, musisz się upewnić, że nie zostanie on zwolniony, dopóki nie skończysz.

Aby porozmawiać na temat używania kopii i zachowania, patrz: this SO question.

0

Jeśli zamierzasz zatrzymać przedmiot i używać go, użyj retain. W przeciwnym razie może zostać zwolniony, a skończy się błąd z kodem.

53

Przypisanie dotyczy wartości pierwotnych, takich jak BOOL, NSInteger lub double. W przypadku obiektów użyj zachowaj lub skopiuj, w zależności od tego, czy chcesz zachować odniesienie do oryginalnego obiektu czy zrobić jego kopię.

Jedyny wspólny wyjątek to słabe odniesienie, w którym chcesz zachować wskaźnik do obiektu, ale nie można go zachować z powodu cykli referencyjnych. Przykładem tego jest wzorzec delegatów, w którym obiekt (na przykład widok tabeli) przechowuje wskaźnik do swojego delegata. Ponieważ obiekt delegata zachowuje widok tabeli, posiadanie widoku tabeli powoduje, że delegat oznaczałby, że żaden z nich nie zostanie zwolniony. Zamiast tego używane jest słabe odniesienie. W tej sytuacji używałbyś przydzielać podczas tworzenia swojej własności.

Powiązane problemy