2011-02-01 10 views
100

Apple recomienda a declarar una propiedad BOOL esta manera:El uso de una propiedad BOOL

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

Como estoy usando Objective-C 2.0 propiedades y la notación de punto, puedo acceder a esta propiedad mediante self.working. Sé que también podría usar [self isWorking], pero no es necesario.

Así que, como uso la notación de puntos en todas partes, ¿por qué debería definir una propiedad adicional? Estaría bien simplemente escribir

@property (nonatomic, assign) BOOL working; 

o tengo ningún beneficio escritura getter=isWorking en mi caso (el uso de la notación de puntos)?

Gracias!

+3

¿No es esta una recomendación basada en la semántica? por lo que myCar.isWorking sería semánticamente más preciso que myCar.working – justcompile

Respuesta

188

Apple simplemente recomienda declarar un getter isX con fines estilísticos. No importa si personaliza o no el nombre getter, siempre que utilice la notación de punto o la notación de mensaje con el nombre correcto. Si usted va a utilizar la notación de puntos no hace ninguna diferencia, todavía se accede a él por el nombre de la propiedad:

@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

¿Sin duda tiene que ver más con la codificación de valores clave que con fines puramente estilísticos? – Jasarien

+5

Es un poco extraño que Apple _recomienda_ declarar esos getters 'isX', pero Xcode _no_ puede enumerarlos en la ventana emergente de autocompletado. (En mi ejemplo) 'working' está en la lista, pero' isWorking' no. Así que no veo ningún beneficio en declarar getters de BOOL. Tengo que hacer más para poder usarlos (declarar el captador) pero obtengo menos (sin autocompletar). – Patrick

-27

No hay beneficio para el uso de propiedades con tipos primitivos. @property se utiliza con el montón asignado NSObjects como NSString*, NSNumber*, UIButton* y etc., porque los accesos gestionados de memoria se crean de forma gratuita. Cuando crea un BOOL, el valor siempre se asigna en la pila y no requiere ningún acceso especial para evitar la pérdida de memoria. isWorking es simplemente la forma popular de expresar el estado de un valor booleano.

En otro idioma OO, usted haría una variable private bool working; y dos accesos: SetWorking para el ajustador y IsWorking para el accesorio.

+1

No está respondiendo su pregunta, es decir, cuál es el propósito de nombrar explícitamente a getter algo más que la propiedad (no pregunta si las propiedades son una buena idea). Además, las propiedades permiten KVO y KVC, por lo que el punto que haces es engañoso. –

+0

Tiene razón al pasar por alto el uso de KVO y KVC con propiedades primitivas.Creo que todos en el hilo están abordando su pregunta con respecto al trabajo en equipo: es una convención de nombres. –

+24

Esto es completamente incorrecto; '@ property' está destinado a ser utilizado con tipos primitivos y, por pura coherencia, tiene importantes ventajas. Además, algunos tipos primitivos (tipos de 64 bits en algunas CPU de 32 bits y tipos de 128 bits en muchas CPU de 32 y 64 bits) no tienen asignación atómica; La atomicidad de '@ property' también puede ser ventajosa en esos casos. – bbum

2

Apple lo recomienda para purposes.If estilística se escribe este código:

@property (nonatomic,assign) BOOL working; 

entonces no se puede utilizar [objeto isWorking].
Se mostrará un error. Pero si usa el siguiente código significa

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

Para que pueda usar [object isWorking].

Cuestiones relacionadas