2011-02-01 16 views
100

Apple zaleca, aby zadeklarować właściwość bool ten sposób:Korzystanie właściwość BOOL

@property (nonatomic, assign, getter=isWorking) BOOL working; 

Ponieważ używam Objective-C 2.0 Właściwości i notacji kropka, mam dostęp do tego personelowi self.working. Wiem, że mogę również użyć [self isWorking] - ale nie muszę.

Ponieważ używam wszędzie notacji kropkowanych, dlaczego powinienem zdefiniować dodatkową właściwość? Byłoby dobrze, aby po prostu napisać

@property (nonatomic, assign) BOOL working; 

Albo mam żadnych korzyści pisanie getter=isWorking w moim przypadku (wykorzystanie notacji dot)?

Dzięki!

+3

Czy to nie jest zalecenie semantyczne? więc myCar.isWorking byłaby semantycznie dokładniejsza niż myCar.working – justcompile

Odpowiedz

188

Apple po prostu zaleca zadeklarowanie odbiorcy isX dla celów stylistycznych. Nie ma znaczenia, czy dostosujesz nazwę gettera, czy nie, o ile używasz notacji kropkowej lub notacji komunikatów o poprawnej nazwie. Jeśli masz zamiar używać notacji kropki to nie robi różnicy, nadal do niego dostęp przez nazwę nieruchomości:

@property (nonatomic, assign) BOOL working; 

[self setWorking:YES];   // Or self.working = YES; 
BOOL working = [self working]; // Or = self.working; 

Albo

@property (nonatomic, assign, getter=isWorking) BOOL working; 

[self setWorking:YES];   // Or self.working = YES;, same as above 
BOOL working = [self isWorking]; // Or = self.working;, also same as above 
+4

Z pewnością jest to bardziej związane z tym, że jest to kodowanie zgodne z kluczowymi wartościami, a nie tylko funkcje stylistyczne? – Jasarien

+5

To trochę dziwne, że Apple _recommends_ deklaruje te getytory 'isX', ale Xcode _nie_ jest w stanie wyświetlić je w oknie wyskakującym auto-completion. (W moim przykładzie) 'working' jest tam wymienione, ale' isWorking' nie jest. Tak więc nie widzę żadnych korzyści w deklarowaniu modułów pobierających BOOL. Muszę zrobić więcej, aby móc z nich korzystać (zadeklaruj zdobywcę), ale ja dostaję mniej (bez automatycznego uzupełniania). – Patrick

-27

Nie ma korzyści przy użyciu właściwości z prymitywnych typów. @property jest używany z stertą przydzieloną NSObjects, takich jak NSString*, NSNumber*, UIButton* itd., Ponieważ obiekty zarządzające pamięcią są tworzone za darmo. Podczas tworzenia wartości BOOL wartość jest zawsze przydzielana na stosie i nie wymaga żadnych specjalnych akcesorów, aby zapobiec wyciekom pamięci. isWorking to po prostu popularny sposób wyrażania stanu wartości boolowskiej.

W innym języku OO należy wprowadzić zmienną private bool working; i dwa elementy pomocnicze: SetWorking dla setera i IsWorking dla akcesora.

+1

Nie odpowiadasz na jego pytanie, a mianowicie, co jest celem jawnego nazywania gettera czymś innym niż własność (nie pyta, czy właściwości są dobrym pomysłem). Ponadto, właściwości pozwalają na KVO i KVC, więc punkt, który robisz, jest mylący. –

+0

Masz rację, że przeoczyłem użycie KVO i KVC z prymitywnymi właściwościami.Myślę, że każdy w wątku odpowiada na jego pytanie dotyczące isWorking - jest to konwencja nazewnictwa. –

+24

To jest całkowicie niepoprawne; '@ property' jest w dużym stopniu przeznaczone do używania z typami pierwotnymi i, dla samej spójności, ma znaczące zalety. Ponadto, niektóre typy prymitywne (typy 64-bitowe na niektórych 32-bitowych procesorach i 128-bitowych na wielu procesorach 32- i 64-bitowych) są nieatomowe; Atomowość '@ własności 'może być również korzystna w tych przypadkach. – bbum

2

Apple zaleca dla stylistycznej purposes.If napisać ten kod:

@property (nonatomic,assign) BOOL working; 

Wtedy nie można użyć funkcji [object isWorking].
Pokaże błąd. Ale jeśli użyjesz poniższego kodu, oznacza to, że:

@property (assign,getter=isWorking) BOOL working; 

Możesz użyć [object isWorking].