Czy są jakieś dobre zasady, których należy się nauczyć, kiedy powinienem zachować i kiedy przypisać?Jak mogę się dowiedzieć, czy muszę zachować lub przypisać nieruchomość?
Odpowiedz
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.
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.
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.
Wiem, że to było stare pytanie, ale znalazłem te wskazówki od guru uber Matt Gallagher, bardzo przydatne: http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html. W moim przypadku miałem "zachowane piekło" mojego własnego wyrobu za posiadanie odniesienia do obiektu nadrzędnego.
- 1. Czy muszę zachować odniesienie do FileSystemWatcher?
- 2. Jak się dowiedzieć, czy plik został zmodyfikowany?
- 3. Jak mogę się dowiedzieć, gdzie utworzono obiekt?
- 4. Jak mogę się dowiedzieć, kto nazwał SendMessage?
- 5. Swift: jak dowiedzieć się, czy list jest alfanumeryczny lub Digit
- 6. Jak mogę się dowiedzieć, czy istnieje nieistniejący RenderSection?
- 7. Android, Jak mogę się dowiedzieć, czy animacja została zakończona?
- 8. Jak mogę się dowiedzieć, czy obiekt implementuje daną metodę?
- 9. Jak mogę się dowiedzieć, czy pierwszy znak ciągu jest liczbą?
- 10. Jak mogę się dowiedzieć, czy Oddział został połączony z Pnia?
- 11. Jak mogę się dowiedzieć, czy AdMob załadował reklamę?
- 12. W ASP.Net, Czy mogę dowiedzieć się, czy inna sesja istnieje lub jest ważna przez identyfikator sesji?
- 13. Gdzie mogę się dowiedzieć o systemach rekomendacji?
- 14. Jak mogę się dowiedzieć, ile plików znajduje się w katalogu?
- 15. Jak mogę się dowiedzieć, czy plik jest plikiem lub katalogiem, jeśli nie istnieje?
- 16. Jak mogę dowiedzieć się, jak została wywołana kompilacja w Jenkins
- 17. Gdzie mogę dowiedzieć się więcej o WebCoreSharedBufferData?
- 18. Czy muszę zachować plik otwarty po wywołaniu mmap na nim?
- 19. Jak się dowiedzieć, czy UIkeyboard pojawił się w systemie iOS?
- 20. Gdzie mogę się dowiedzieć o MEF?
- 21. Jak mogę się dowiedzieć, gdzie BufferedImage ma Alpha w Javie?
- 22. Nie mogę się dowiedzieć, jak użyć składnika miniatur Bootstrap
- 23. Czy mogę przypisać 0 do shared_ptr? Czemu?
- 24. Jak mogę się dowiedzieć o pisaniu specyfikacji projektu?
- 25. Jak się dowiedzieć, czy adres Ethereum jest umową?
- 26. Jak sprawdzić, czy nieruchomość istnieje?
- 27. Jak mogę się dowiedzieć, którą wersję Doctrine używam?
- 28. Jak mogę się dowiedzieć, czy aktualizacja lub wstawienie zakończyło się pomyślnie w dynamoDB przy użyciu Java SDK?
- 29. Jak mogę się dowiedzieć, z której przeglądarki korzysta użytkownik?
- 30. Jak mogę się dowiedzieć, kto jest wepchnięty w git?
Doskonała odpowiedź poniżej. Byłoby wspaniale, gdybyś mógł je oznaczyć jako zaakceptowany. – memmons