2010-11-04 16 views
6

Obviamente, con obj-c, generalmente no hay razón para escribir getters y setters (gracias al útil mr @synthesize).Escritura getter y setter para BOOL variable

Así que ahora, necesitando hacer exactamente esto, me he encontrado con el problema de que no sé cómo escribirlos. : p

Estoy seguro de que probablemente no voy a resolver mi problema de la manera correcta - sería mucho más fácil solo subclasificar mi objeto y tal - pero estoy tratando de escribir el código de categoría para agregar propiedades porque (al principio) fue más rápido, y porque quería aprender a usar el código de categoría en mi aplicación.

Tengo esto:

-(BOOL)isMethodStep { 
    return self.isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    if(self.isMethodStep != theBoolean){ 
     self.isMethodStep = theBoolean; 
    } 
} 

y lo he probado sin la consulta si en la incubadora, pero ninguno parece funcionar. Cargarlo con puntos de interrupción muestra que, por alguna razón, se queda atascado en un bucle continuo en el método getter.

¿Es correcto este código o estoy haciendo algo mal?

Gracias Tom

Respuesta

11

En

-(BOOL)isMethodStep { 
    return self.isMethodStep; 
} 

return self.isMethodStep; llama al mismo método isMethodStep que causa un bucle infinito. Lo mismo para Setter.

Sólo tiene que utilizar sus Ivars directamente en sus implementaciones de métodos de descriptor de acceso:

-(BOOL)isMethodStep { 
    return isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    if(isMethodStep != theBoolean){ 
     isMethodStep = theBoolean; 
    } 
} 
+0

sí, pensé. :) pero, ¿cómo evito que esto suceda? ¿Cómo los escribo? –

+0

- (BOOL) isMethodStep { return isMethodStep; } – superfell

+0

He editado mi respuesta, supongo que los métodos deberían verse así (si no te importa la atomicidad, no soy bueno para resolver problemas ...) – Vladimir

3

usted no desea utilizar la sintaxis self. propiedad dentro de la incubadora/captador, ya que invoca el setter/getter de nuevo, en lugar de asignando directamente a la variable.

Es necesario a decir:

-(BOOL)isMethodStep { 
    return isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    isMethodStep = theBoolean; 
} 

(asumiendo "isMethodStep" es el nombre de la variable). También omitiría la prueba en el método setter ...

+1

Me sale que 'isMethodStep no está declarado '. :/ –

+0

mismo problema. Pon '_isMethodStep' – WebOrCode

Cuestiones relacionadas