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=isWorking
w moim przypadku (użycie notacji kropkowej)?
Dzięki!
objective-c
ios
properties
Patrick
źródło
źródło
Odpowiedzi:
Apple po prostu zaleca zadeklarowanie
isX
gettera 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:Lub
źródło
isX
pobierających, ale Xcode nie jest w stanie wyświetlić ich w wyskakującym okienku automatycznego uzupełniania. (W moim przykładzie)working
jest tam wymienione, aleisWorking
nie 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).Apple zaleca ze względów stylistycznych. Jeśli napiszesz ten kod:
Wtedy nie możesz użyć [object isWorking].
Pokaże błąd. Ale jeśli użyjesz poniższego kodu oznacza
Możesz więc użyć [object isWorking].
źródło
Używanie właściwości z typami pierwotnymi nie przynosi żadnych korzyści.
@property
jest używany z sterty przydzielonegoNSObjects
jakNSString*
,NSNumber*
,UIButton*
, i etc, ponieważ pamięć udało Akcesory tworzone są za darmo. Podczas tworzeniaBOOL
wartość jest zawsze alokowana na stosie i nie wymaga żadnych specjalnych metod dostępu, aby zapobiec wyciekowi pamięci.isWorking
jest po prostu popularnym sposobem wyrażania stanu wartości logicznej.W innym języku obiektowym utworzyłbyś zmienną
private bool working;
i dwa akcesory:SetWorking
dla ustawiającego iIsWorking
dla akcesora.źródło
@property
jest 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;@property
Atomowość może być również korzystna w tych przypadkach.atomic
inonatomic
?