Utilisation d'une propriété BOOL


111

Apple recommande de déclarer une propriété BOOL de cette manière:

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

Comme j'utilise les propriétés Objective-C 2.0 et la notation par points, j'accède à cette propriété en utilisant self.working . Je sais que je pourrais aussi utiliser [self isWorking]- mais je n'ai pas à le faire.

Donc, comme j'utilise la notation par points partout, pourquoi devrais-je définir une propriété supplémentaire? Serait-il correct d'écrire simplement

@property (nonatomic, assign) BOOL working;

Ou ai-je des avantages à écrire getter=isWorking dans mon cas (utilisation de la notation par points)?

Merci!


4
N'est-ce pas une recommandation sémantique? donc myCar.isWorking serait sémantiquement plus précis que myCar.working
compilez simplement le

Réponses:


206

Apple recommande simplement de déclarer un isXgetter à des fins stylistiques. Peu importe que vous personnalisiez le nom du getter ou non, tant que vous utilisez la notation par points ou la notation de message avec le nom correct. Si vous allez utiliser la notation par points, cela ne fait aucune différence, vous y accédez toujours par le nom de la propriété:

@property (nonatomic, assign) BOOL working;

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

Ou

@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
Cela a-t-il plus à voir avec le codage des valeurs clés qu'à des fins stylistiques?
Jasarien

5
C'est un peu étrange qu'Apple recommande de déclarer ces isXgetters, mais Xcode n'est pas en mesure de les lister dans la fenêtre de saisie semi-automatique. (Dans mon exemple) workingest répertorié ici, mais isWorkingne l'est pas. Je ne vois donc aucun avantage à déclarer des getters BOOL. Je dois faire plus pour pouvoir les utiliser (déclarer le getter) mais j'en reçois moins (pas d'auto-complétion).
Patrick

4

Apple recommande à des fins stylistiques.Si vous écrivez ce code:

@property (nonatomic,assign) BOOL working;

Ensuite, vous ne pouvez pas utiliser [object isWorking].
Il affichera une erreur. Mais si vous utilisez le code ci-dessous, cela signifie

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

Vous pouvez donc utiliser [object isWorking].


-26

Il n'y a aucun avantage à utiliser des propriétés avec des types primitifs. @propertyest utilisé avec tas alloué NSObjectscomme NSString*, NSNumber*, UIButton*et etc, parce que la mémoire gérée accesseurs sont créés gratuitement. Lorsque vous créez un BOOL, la valeur est toujours allouée sur la pile et ne nécessite aucun accesseur spécial pour éviter les fuites de mémoire. isWorkingest simplement la manière courante d'exprimer l'état d'une valeur booléenne.

Dans un autre langage OO, vous créeriez une variable private bool working;et deux accesseurs: SetWorkingpour le setter et IsWorkingpour l'accesseur.


1
Vous ne répondez pas à sa question, à savoir quel est le but de nommer explicitement getter autre chose que la propriété (il ne demande pas si les propriétés sont une bonne idée). De plus, les propriétés autorisent KVO et KVC, ce que vous faites est donc trompeur.
Martin Gjaldbaek

Vous avez raison de dire que j'ai négligé l'utilisation de KVO et KVC avec des propriétés primitives. Je pense que tout le monde dans le fil répond à sa question concernant isWorking - c'est une convention de dénomination.
Thomson Comer

25
C'est tout à fait incorrect; @propertyest très destiné à être utilisé avec des types primitifs et, pour des raisons de cohérence uniquement, présente des avantages significatifs. En outre, certains types primitifs (types 64 bits sur certains processeurs 32 bits et types 128 bits sur de nombreux processeurs 32 et 64 bits) sont non atomiques lors de l'affectation; @propertyL 'atomicité de ce dernier peut également être avantageuse dans ces cas.
bbum

1
Intéressant - mais comment diable suis-je censé savoir ça? :) Est-ce une implicité duatomicnonatomic attributs et ?
Thomson Comer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.