2012-05-21 15 views
12

Necesito crear una variable de instancia de tipo BOOL con un valor predeterminado de False en una de mis clases Objective-C. ¿Cómo hago esto? He visto personas que lo definen en su archivo .h pero realmente no necesito que esta variable sea pública. Por lo tanto, ¿no debería ponerlo en mi archivo .m? Además, ¿debería convertirlo en una propiedad? ¿O nunca debería hacer de algo una propiedad? Gracias.¿Cómo creo una variable de instancia BOOL en el objetivo c?

+0

Probar: '- (void) viewDidLoad { bandera BOOL = NO; } '. Además, una vez que desee declarar en su archivo .m no podrá sintetizarlo desde un archivo .m. –

+0

¿Dónde debería definir 'flag'? ¿No tiene sentido en el archivo .m? Sin embargo, no puedo entender la sintaxis para eso. Thx – Nosrettap

+0

define la propiedad en la clase .m como lo hace en .h ... hará que el bool sea privado para la clase no accesible desde el exterior. – iphonic

Respuesta

21

Necesito crear una variable de instancia de tipo BOOL con un valor predeterminado de FALSE en una de mis clases objetivo c. ¿Cómo hago esto?

Suponiendo que está utilizando el Xcode actual, puede declarar la Ivar en la implementación de esta manera:

@implementation MyClass 
{ 
@private 
    BOOL myBool; 
} 

He visto gente lo define en su archivo .h pero don' Realmente necesito que esta variable sea pública.

Históricamente, había que declarar variables de instancia en el @interface debido a la forma en que se implementaron las clases. Esto ahora es necesario solo si se dirige a 32 bits OS X.

Además, ¿debo hacer una propiedad?

Eso depende. Definitivamente debe convertirlo en propiedad si es parte de la API externa de su clase (para clases o subclases no relacionadas). Si solo es parte del estado interno del objeto, no necesita convertirlo en una propiedad (y yo no lo hago). t).

O si alguna vez no hacer algo una propiedad? Gracias.

Si no está utilizando ARC y el tipo es un tipo de objeto (BOOL no lo es) siempre se debe hacer una propiedad para aprovechar la administración de la memoria de los accesadores sintetizados. Si es usando ARC, el consejo en la lista de desarrolladores de Apple es hacer cosas que formen parte de las propiedades de la API. y cosas que son estado interno como ivars.

Tenga en cuenta que, incluso para el estado interno, es posible que desee utilizar KVO, en cuyo caso, utilice una propiedad.

Si declara este BOOL como una propiedad y lo sintetiza, no necesita declarar explícitamente el ivar. Si desea hacer que la propiedad "visible", sólo para la propia clase, utilizar una extensión de clase

@interface MyClass() 

@property (assign) BOOL myBool; 

@end 

@implementation MyClass 

@synthesize myBool = myBool_; // creates an ivar myBool_ to back the property myBool. 

@end 

Tenga en cuenta que, aunque el compilador producirá advertencias de lo anterior, en tiempo de ejecución, cualquier clase puede enviar setMyBool: o myBool a los objetos de MyClass.

0

Si lo convierte en una propiedad, es público. Si no desea que la variable sea pública, entonces no use una propiedad. ¿Por qué no quieres ser público? Puede tener propiedad de solo lectura y hacer que se pueda escribir en usted .m a través de una categoría privada.

Usted puede ponerlo en su archivo .m si utiliza iOS 5

@implementation MyClass { 
    BOOL _myBool; 
} 

Creo que esto es nuevo para iOS5. Pero he visto código como este también:

@implementation MyClass { 
@private 
    BOOL _myBool; 
} 

Espero que esto ayude.

+0

"Si lo convierte en una propiedad, es público". En realidad no. Las propiedades se pueden declarar de forma privada en una extensión o categoría de clase. – jlehr

+0

Pero si no haces nada, son públicos. – Pfitz

+0

Si no hace nada, no tiene nada. Lo que determina si un método o una propiedad es público es dónde se declara. Si se declara en el encabezado, es públicamente visible; de lo contrario no lo es. (Sin embargo, no hay ejecución en tiempo de ejecución) – jlehr

2

BOOL se declaran como iVars con un simple BOOL myBool, y como una propiedad con @property (nonatomic, assign) BOOL myBool. Sin embargo, tome nota, los valores BOOLean se inician en NO (nil). Si necesita un BOOL para ser accesible desde otras clases, o "global" en el archivo m, use un iVar o una propiedad, de lo contrario simplemente declare como vars de ámbito en un método individual.

+0

BOOL ivars inicializados en SÍ? ¿Quieres repensar esa afirmación? – jrturton

+0

¿Creerías ... Autocorrección? – CodaFi

11

Si desea hacer una variable privada puede usar la potencia de las categorías. Hacer una clase MyClass por ejemplo y en el archivo .m haga lo siguiente:

#import "MyClass.h" 

@interface MyClass() //This is an empty category on MyClass class 

@property (nonatomic, assign) BOOL myBool; 

@end 


@implementation MyClass 

@synthesize myBool = _myBool; 

-(void)myMethod { 
    self.myBool = YES; //this is using the property 
    _myBool = NO; //this is the instance variable, as @synthesize creates an instance variable for you 
    // both are private 
} 

@end 
1

Se puede retener la declaración en el archivo .m.

Si usted hace una propiedad, depende de lo que desee. Como propiedad, más adelante puede aplicar setter/getter que incluya control/guardias/lo que sea. Además, puede aplicar acceso a valores-clave.

Si no necesita uno de esto, no hay una necesidad real de una propiedad (pero una buena tradición: nunca se sabe cómo evolucionará su código).

0

i uso 0, 1 vez YES, NO

#define YES 1 
#define NO 0 
Cuestiones relacionadas