Korzystanie z właściwości BOOL


111

Apple zaleca zadeklarowanie właściwości BOOL w następujący sposób:

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

Ponieważ używam właściwości Objective-C 2,0 i notacji z kropkami, uzyskuję dostęp do tej właściwości przy użyciu self.working. Wiem, że mógłbym też skorzystać [self isWorking]- ale nie muszę.

Skoro więc wszędzie używam notacji kropkowej, dlaczego miałbym definiować dodatkową właściwość? Czy byłoby dobrze po prostu napisać

@property (nonatomic, assign) BOOL working;

Czy mam jakieś korzyści z pisania getter=isWorkingw moim przypadku (użycie notacji kropkowej)?

Dzięki!


4
Czy to nie jest zalecenie oparte na semantyce? więc myCar.isWorking byłoby semantycznie dokładniejsze niż myCar.working
prostu skompiluj

Odpowiedzi:


206

Apple po prostu zaleca zadeklarowanie isXgettera ze względów stylistycznych. Nie ma znaczenia, czy dostosujesz nazwę pobieracza, czy nie, o ile używasz notacji kropkowej lub notacji wiadomości z poprawną nazwą. Jeśli zamierzasz używać notacji z kropką, nie ma to znaczenia, nadal uzyskujesz do niej dostęp za pomocą nazwy właściwości:

@property (nonatomic, assign) BOOL working;

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

Lub

@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ą ma to więcej wspólnego z zachowaniem zgodności z kodowaniem kluczowych wartości niż tylko ze względów stylistycznych?
Jasarien

5
To trochę dziwne, że Apple zaleca zadeklarowanie tych isXpobierających, ale Xcode nie jest w stanie wyświetlić ich w wyskakującym okienku automatycznego uzupełniania. (W moim przykładzie) workingjest tam wymienione, ale isWorkingnie ma. Więc nie widzę żadnych korzyści w deklarowaniu getterów BOOL. Muszę zrobić więcej, aby móc z nich korzystać (zadeklarować metodę pobierającą), ale otrzymuję mniej (brak autouzupełniania).
Patrick,

4

Apple zaleca ze względów stylistycznych. Jeśli napiszesz ten kod:

@property (nonatomic,assign) BOOL working;

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

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

Możesz więc użyć [object isWorking].


-26

Używanie właściwości z typami pierwotnymi nie przynosi żadnych korzyści. @propertyjest używany z sterty przydzielonego NSObjectsjak NSString*, NSNumber*, UIButton*, i etc, ponieważ pamięć udało Akcesory tworzone są za darmo. Podczas tworzenia BOOLwartość jest zawsze alokowana na stosie i nie wymaga żadnych specjalnych metod dostępu, aby zapobiec wyciekowi pamięci. isWorkingjest po prostu popularnym sposobem wyrażania stanu wartości logicznej.

W innym języku obiektowym utworzyłbyś zmienną private bool working;i dwa akcesory: SetWorkingdla ustawiającego i IsWorkingdla akcesora.


1
Nie odpowiadasz na jego pytanie, a mianowicie, jaki jest cel jawnego nazwania gettera czymś innym niż właściwość (nie pyta, czy właściwości to dobry pomysł). Ponadto właściwości uwzględniają KVO i KVC, więc stwierdzenie, które robisz, jest mylące.
Martin Gjaldbaek

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 - to konwencja nazewnictwa.
Thomson Comer

25
To jest całkowicie błędne; @propertyjest bardzo przeznaczony do stosowania z typami prymitywnymi i dla samej spójności ma znaczące zalety. Co więcej, niektóre typy pierwotne (64-bitowe na niektórych 32-bitowych procesorach i 128-bitowe na wielu 32- i 64-bitowych procesorach) są nieatomowe przy przypisywaniu; @propertyAtomowość może być również korzystna w tych przypadkach.
bbum

1
Ciekawe - ale skąd mam to wiedzieć? :) Czy jest to konsekwencja atrybutów atomici nonatomic?
Thomson Comer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.