Powinieneś zajmować się tylko twoimi ivars w init
i dealloc
lub gdy jest to absolutnie wymagane przez szczegóły implementacji (takie jak wewnątrz samego akcesora, lub gdy faktycznie potrzebujesz adresu pamięci). Inne niż w tych miejscach, należy zawsze używać akcesora, co oznacza [self foo]
zamiast _foo
.
self.foo
to tylko cukier syntaktyczny dookoła rzeczywistego połączenia, czyli [self foo]
. Ważne jest, aby zrozumieć, że self.foo
jest standardową wiadomością wysyłania ObjC i oznacza dokładnie to samo, co [self foo]
. Zgodnie z konwencją, powinieneś używać tylko składni punktowej w odniesieniu do właściwości.
Pre-ARC, bezpośrednie użycie ivarów było pierwszą przyczyną awarii w moim doświadczeniu.Prawdopodobieństwo, że popełnisz błąd podczas przypisywania bezpośrednio do ivar bez ARC, szybko zbliża się do 100% w stosunku do zakresu programu.
Od ARC wciąż twierdzę, że należy zawsze używać akcesorów (z wyjątkami podanymi powyżej), ale przyczyny są bardziej subtelne. Głównym powodem tego jest to, że akcesor może być dostosowany, albo w obecnej klasie, w podklasie, albo poprzez KVO (co dzieje się całkowicie poza twoim kodem). Jeśli uzyskasz bezpośredni dostęp do ivar, to obejdziesz to. Załóżmy na przykład, że właściwość jest tworzona leniwie (co jest dość powszechne). Jeśli użyjesz ivar, zanim zostanie on utworzony, dostaniesz subtelne błędy. Musisz więc pamiętać o tej właściwości, aby zawsze używać akcesora. Podobnie możesz zadzwonić pod numer setNeedsDisplay
lub wysłać powiadomienie lub coś podobnego.
Jeśli masz prostą regułę, która mówi "zawsze będę używać akcesorów", łatwo będzie przejrzeć kod i wiedzieć, że jest właściwy. W kilku przypadkach musisz ominąć akcesorium, _
mówi "Hej, zwróć uwagę, robię coś dziwnego".
Jeśli masz regułę "użyję akcesorów dla właściwości, które jej potrzebują, ale nie dla tych, które tego nie robią", to prawie niemożliwe jest sprawdzenie kodu i sprawdzenie, czy jest ono poprawne. Czy poprzedni programista używał ivar, ponieważ był wymagany lub tylko dlatego, że tak się czuł? Czy możesz to zmienić, czy nie? Bardzo trudno o tym wiedzieć.
Więc nawet po ARC, konsekwentne używanie akcesorów jest dobrym programowaniem defensywnym i bardzo polecam.
Cóż, to jest bardzo sprzeczne z odpowiedzią Ragnara! Co sądzisz o dodatkowej wartości dodanej, przechodząc przez setera? A także fakt, że inni ludzie mogą pracować z kodem i zmieniać setery/wywołania prowadzące do nieoczekiwanych wyników? – jgvb
"Dodatkowe" zabezpieczenie nie jest "dodatkowym". Jest to wymagane utrzymanie, które należy zastosować, a przystawka jest właściwym miejscem do tego (dotyczy to tylko wstępnego ARC, ale niepoprawne zastosowanie, które zachowuje się poprawnie, jest główną przyczyną awarii, o których wspomniałem). Chcesz używać akcesorów dokładnie *, ponieważ * inne osoby mogą pracować nad kodem i nie ma sposobu, aby upewnić się, że wszyscy wiedzą i zawsze podążają za "kiedy zmieniasz to ivar, musisz również ..." Właściwy sposób na udokumentuj, że niestandardowe wymagania są realizowane przez akcesor. –
Czasami może to prowadzić do zaskakujących wyników (np. Zbyt często przeliczania), ale te efekty uboczne prawie zawsze są znacznie łatwiejsze do debugowania niż fakt, że nie wiedziałeś, że musisz zadzwonić "setNeedsDisplay" po ustawieniu ivar. To prowadzi do rzeczy, które "robią coś innego, jak nie", które są wyjątkowo trudne do debugowania. Uruchomienie akcesora, gdy nie wiesz, że to się stanie, pojawia się na liście stosu. Nie udało się uruchomić akcesora, którego nie wiedziałeś, że musisz uruchomić .... to jest trudne do znalezienia. –