Po przeczytaniu pokornie artykułu Roberta McNally'ego „Przykazania kodu: najlepsze praktyki kodowania Objective-C” nieco mniej niż dwa lata temu, zaadaptowałem praktykę używania właściwości dla prawie każdego członka danych z moich klas Objective-C ( trzecie przykazanie z maja 2012 r.). McNally wymienia następujące powody (moje podkreślenie):
- Właściwości wymuszają ograniczenia dostępu (takie jak tylko do odczytu)
- Właściwości egzekwują zasady zarządzania pamięcią (mocne, słabe)
- Właściwości zapewniają możliwość transparentnego wdrożenia niestandardowych programów ustawiających i pobierających.
- Właściwości z ustawieniami niestandardowymi lub obiektami pobierającymi mogą służyć do egzekwowania strategii bezpieczeństwa wątków.
- Posiadanie jednego sposobu dostępu do zmiennych instancji zwiększa czytelność kodu.
Większość moich nieruchomości umieszczam w kategoriach prywatnych, więc numery 1 i 4 zwykle nie są problemami, z którymi się spotykam. Argumenty 3 i 5 są bardziej „miękkie”, a przy odpowiednich narzędziach i innych konsekwencjach mogą stać się bezproblemowe. Wreszcie, dla mnie najbardziej wpływowy z tych argumentów był numer 2, zarządzanie pamięcią. Odtąd to robię.
@property (nonatomic, strong) id object; // Properties became my friends.
W ostatnich kilku projektach przestawiłem się na ARC, co wzbudziło we mnie wątpliwości, czy tworzenie właściwości praktycznie wszystkiego jest nadal dobrym pomysłem, czy może trochę zbędnym. ARC dba o zarządzanie pamięcią obiektów Objective-C, co dla większości strong
członków działa dobrze, jeśli tylko zadeklarujesz ivars. Typy C, którymi musiałeś ręcznie zarządzać, przed i po ARC, a weak
właściwości są przeważnie publiczne.
Oczywiście nadal używam właściwości do wszystkiego, co wymaga dostępu spoza klasy, ale w większości są to tylko garść właściwości, podczas gdy większość członków danych jest wymienionych jako ivars pod nagłówkiem implementacji
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
Jako eksperyment robiłem to nieco bardziej rygorystycznie, a odejście od właściwości dla wszystkiego ma pewne pozytywne pozytywne skutki uboczne.
- Wymagania dotyczące kodu członka danych (
@property
/@synthesize
) zmniejszyły się do deklaracji ivar. - Większość moich
self.something
referencji wyczyściłem tylko_something
. - Łatwo jest odróżnić, którzy członkowie danych są prywatni (ivars), a którzy publiczni (właściwości).
- Wreszcie, „wydaje się”, że to właśnie był cel, do którego Apple zamierzał mieć właściwości, ale to subiektywna spekulacja.
Na pytanie : powoli przesuwam się w stronę ciemnej strony, używając coraz mniej właściwości na rzecz implementacji ivars. Czy możesz podać mi trochę uzasadnienia, dlaczego powinienem trzymać się właściwości do wszystkiego, lub potwierdzić mój obecny ciąg myśli, dlaczego powinienem używać więcej ivarów i mniej właściwości tylko tam, gdzie jest to potrzebne? Najbardziej przekonująca odpowiedź dla każdej ze stron otrzyma mój znak.
EDYCJA: McNally waży na Twitterze, mówiąc : „Myślę, że moim głównym powodem pozostania przy właściwościach jest: jeden sposób na zrobienie wszystkiego, co robi wszystko (w tym KVC / KVO.)”