objective c - guia - Valor predeterminado de BOOL
qgis manual (2)
¿Cuál es el valor predeterminado de una variable BOOL
en Objective-C?
Hice algunos experimentos propios usando Xcode 5.1, OS X Mavericks 10.9.4. Para aquellos que no saben, ALog es un NSLog modificado. De todos modos, el primer experimento fue utilizar isLandscape
como una variable pública, con @synthesize
, para ser accedido por el controlador de vista padre (se muestra a continuación). El segundo experimento no utilizó @synthesize
y, obviamente, usé self.isLandscape
para obtener el mismo resultado en la consola. La salida de la consola está debajo de mi código. El tercer experimento usó ''isLandscape'' como una variable local dentro de un método.
@interface MyClass : UIView // (subclass used in my UIViewController)
…
@property (nonatomic) BOOL isLandscape; // < - - - testing this BOOL
…
@implementation MyClass
…
@synthesize isLandscape;
- (void)awakeFromNib
{
[super awakeFromNib];
// Test for YES or NO
if (isLandscape == YES) {
ALog(@"isLandscape == YES");
} else if (isLandscape == NO) {
ALog(@"isLandscape == NO");
} else {
ALog(@"isLandscape != YES/NO");
}
// Test for nil or non-nil
if (isLandscape) {
ALog(@"isLandscape");
} else if (!isLandscape) {
ALog(@"!isLandscape");
} else {
ALog(@"!= nil/non-nil");
}
// Test its value
ALog(@"isLandscape == %d", isLandscape);
}
Estos resultados son de los primeros dos experimentos ...
2014-08-28 08:18:52.909 MyApp[493:60b] -[MyClass awakeFromNib] [Line 157] isLandscape == NO
2014-08-28 08:18:52.911 MyApp[493:60b] -[MyClass awakeFromNib] [Line 166] !isLandscape
2014-08-28 08:18:52.912 MyApp[493:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == 0
En el TERCER EXPERIMENTO ''isLandscape'' ya no era una propiedad. Lo configuro como una variable local con resultados interesantes:
- (void)awakeFromNib
{
[super awakeFromNib];
BOOL isLandscape; // < - - - testing this BOOL
// Test for YES or NO
if (isLandscape == YES) {
ALog(@"isLandscape == YES");
} else if (isLandscape == NO) {
ALog(@"isLandscape == NO");
} else {
ALog(@"isLandscape != YES/NO");
}
// Test for nil or non-nil
if (isLandscape) {
ALog(@"isLandscape");
} else if (!isLandscape) {
ALog(@"!isLandscape");
} else {
ALog(@"!= nil/non-nil");
}
// Test its value
ALog(@"isLandscape == %d", isLandscape);
}
Estos resultados son del tercer experimento ...
2014-08-28 08:28:33.483 MyApp[581:60b] -[MyClass awakeFromNib] [Line 159] isLandscape != YES/NO
2014-08-28 08:28:33.486 MyApp[581:60b] -[MyClass awakeFromNib] [Line 164] isLandscape
2014-08-28 08:28:33.487 MyApp[581:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == -24
Supongo que las propiedades las inicializo yo o Xcode automáticamente, pero las variables locales no obtienen ningún valor. Aun así, observe que la [línea 164] variable local no es SÍ o NO, pero no es nula. Supongo que es el valor de basura (al azar) con el que no puede contar. Espero que esto ayude a la próxima persona. Aprendí algo, pero espero con interés los comentarios. ¡Gracias y buena suerte!
No hay un valor predeterminado si escribes
-(void)somemethod {
BOOL x; // <--- no default value
Se inicializa a la basura.
Sin embargo, para un ivar BOOL
, se inicializará a NO
, ya que toda la instancia se llena con 0 en la inicialización.
(Nota: Cuando ARC está habilitado, los punteros de objetos locales siempre tendrán un valor predeterminado nil
, pero las variables locales de tipos no objeto como BOOL aún se inicializan en la basura. Consulte Variables locales establecidas en nil? (Objetivo-C)) .