Utilizzo di una proprietà BOOL


111

Apple consiglia di dichiarare una proprietà BOOL in questo modo:

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

Poiché sto utilizzando le proprietà Objective-C 2.0 e la notazione a punti, accedo a questa proprietà utilizzando self.working. So che potrei anche usare [self isWorking], ma non devo.

Quindi, poiché sto usando la notazione del punto ovunque, perché dovrei definire una proprietà extra? Sarebbe giusto scrivere semplicemente

@property (nonatomic, assign) BOOL working;

O ho qualche vantaggio scrivendo getter=isWorkingnel mio caso (utilizzo della notazione punto)?

Grazie!


4
Non è una raccomandazione basata sulla semantica? quindi myCar.isWorking sarebbe semanticamente più accurato di myCar.working
basta compilare il

Risposte:


206

Apple consiglia semplicemente di dichiarare un isXgetter per scopi stilistici. Non importa se personalizzi o meno il nome getter, purché utilizzi la notazione punto o la notazione messaggio con il nome corretto. Se intendi utilizzare la notazione del punto non fa differenza, puoi comunque accedervi dal nome della proprietà:

@property (nonatomic, assign) BOOL working;

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

O

@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
Sicuramente ha più a che fare con l'essere conformi alla codifica dei valori chiave piuttosto che con scopi stilistici?
Jasarien

5
È un po 'strano che Apple consiglia di dichiarare quei isXgetter ma Xcode non è in grado di elencarli nel popup di completamento automatico. (Nel mio esempio) workingè elencato lì, ma isWorkingnon lo è. Quindi non vedo alcun vantaggio nel dichiarare i getter BOOL. Devo fare di più per poterli utilizzare (dichiaro il getter) ma ottengo di meno (nessun autocompletamento).
Patrick

4

Apple consiglia per motivi stilistici Se scrivi questo codice:

@property (nonatomic,assign) BOOL working;

Quindi non puoi usare [object isWorking].
Mostrerà un errore. Ma se usi il codice di seguito significa

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

Quindi puoi usare [object isWorking].


-26

Non c'è alcun vantaggio nell'usare proprietà con tipi primitivi. @propertyè usato con il mucchio assegnato NSObjectscome NSString*, NSNumber*, UIButton*, ed ecc, perché la memoria gestita di accesso vengono creati gratuitamente. Quando si crea un BOOL, il valore viene sempre allocato nello stack e non richiede alcuna funzione di accesso speciale per evitare perdite di memoria. isWorkingè semplicemente il modo popolare di esprimere lo stato di un valore booleano.

In un altro linguaggio OO creeresti una variabile private bool working;e due funzioni di accesso: SetWorkingper il setter e IsWorkingper la funzione di accesso.


1
Non stai rispondendo alla sua domanda, vale a dire qual è lo scopo di nominare esplicitamente getter qualcos'altro oltre alla proprietà (non sta chiedendo se le proprietà sono una buona idea). Inoltre, le proprietà consentono KVO e KVC, quindi il punto che fai è fuorviante.
Martin Gjaldbaek

Hai ragione che ho trascurato l'uso di KVO e KVC con proprietà primitive. Penso che tutti nel thread stiano affrontando la sua domanda riguardante isWorking: è una convenzione di denominazione.
Thomson Comer

25
Questo è del tutto errato; @propertyè molto inteso per essere usato con tipi primitivi e, solo per motivi di coerenza, presenta vantaggi significativi. Inoltre, alcuni tipi primitivi (tipi a 64 bit su alcune CPU a 32 bit e tipi a 128 bit su molte CPU a 32 e 64 bit) non sono atomici nell'assegnazione; @propertyAnche in questi casi l'atomicità può essere vantaggiosa.
bbum

1
Interessante, ma come diavolo dovrei saperlo? :) È un'implicazione degli attributi atomice nonatomic?
Thomson Comer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.