2011-12-12 8 views
8

Tengo una propiedad BOOL que quiero establecer en el inicializador de mi clase.Forma correcta de configurar una propiedad BOOL

@property (assign, nonatomic) BOOL isEditMode; 

- (id)init 
{ 
    . . . 
    [self setValue:NO forKey:isEditMode]; 
    return self; 
} 

El compilador me da una advertencia de "Incompatible integer to poetish conversion". ¿Qué estoy haciendo mal aquí?

Respuesta

16

El método de codificación de valor-clave setValue:forKey: solo acepta objetos como argumentos. Para establecer un BOOL, debe ajustar el número en un objeto de valor con [NSNumber numberWithBool:NO]. Pero hay pocas razones para hacer eso. La clave clave de codificación es una forma indirecta de lograr esto. O bien, haga self.isEditMode = NO o simplemente isEditMode = NO. Este último es preferible en un método init (porque los instaladores pueden ejecutar código arbitrario que podría no ser deseable antes de que un objeto esté completamente configurado).

Pero para explicar el primer punto: La razón por la que la codificación de clave-valor funciona de esta manera es porque el sistema de tipo no puede representar un argumento que a veces es un objeto y otras veces un valor primitivo. Así que KVC siempre trata con objetos y simplemente autocaptura valores primitivos según sea necesario. Del mismo modo, si lo hace [yourObject valueForKey:@"isEditMode"], recibirá un objeto NSNumber que envuelve el valor real.

2

Usted sólo puede asignar el valor directamente:

isEditMode = NO; 
+2

'setValue: forKey:' es un método de NSObject. Será válido para cualquier objeto Cocoa. – Chuck

+0

¿Cuál es el problema con el uso de KVC al establecer el valor BOOL? ¿KVC es solo para objetos? – NSExplorer

+3

Si está utilizando KVC para configurarlo, la clave es una cadena. 'isEditMode' es el ivar booleano real en su clase; lo que quiere es '@" isEditMode "', una cadena que nombra ese ivar. –

2

pienso decir:

self.isEditMode = NO; 

Si su código en efecto, compilar (soy bastante nuevo en Objective-C así que no sé) setValue probablemente toma un puntero a una cadena (@"isEditMode", por ejemplo) y no algún otro tipo (isEditMode, por ejemplo).

+0

Un colocador funcionaría, pero no es necesario. El OP dijo que quiere establecer el valor en el inicializador de la clase y que no ha redefinido el setter en su declaración de propiedad. – Jim

5

La sintaxis correcta para establecer una propiedad es sólo

self.isEditMode = NO; 

Si desea utilizar -setValue:forKey: que tendría que escribir como

[self setValue:[NSNumber numberWithBOOL:NO] forKey:@"isEditMode"]; 

Sin embargo, no hay absolutamente ninguna razón para hacer esto en tu situación

Dicho esto, ya que estás en un método init, recomendaría encarecidamente evitar cualquier acceso a la propiedad en absoluto y en lugar de utilizar directamente el Ivar, como en

isEditMode = NO; 

Esto evita la posibilidad de un colocador de ser reemplazado llamado (ya sea en esta clase o una subclase) que hace la suposición de que el objeto ya ha completado la inicialización. Por esta misma razón, también desea evitar el acceso a la propiedad dentro de -dealloc.

Cuestiones relacionadas