Valor predeterminado de BOOL

Respuestas:

175

No hay un valor predeterminado si escribe

-(void)somemethod {
  BOOL x;  // <--- no default value

Se inicializa como basura.

Sin embargo, para un BOOL ivar , se inicializará en NO, ya que toda la instancia se rellena 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 que no son de objeto como BOOL todavía se inicializan como basura. Consulte ¿ Variables locales establecidas en nil? (Objective-C)) .

Kennytm
fuente
1
¿Puedes contar con el BOOL non ivar para ser siempre la misma basura? o es diferente? (es decir, lo veo evaluar al valor entero de '2' en una declaración NSlog)
bentford
8
@bentford: No, no puedes.
kennytm
@bentford El ivar se inicializa NOcomo se mencionó anteriormente. Creo que te refieres a var.
Raffi Khatchadourian
1
parece ser trivial pero muy importante de saber! ¡¡Gracias!!
billones
1
@KennyTM "los tipos que no son objetos como BOOL con ARC habilitado aún se inicializarán como basura". ¿Estás seguro de eso? El enlace que proporciona dice "Las variables de instancia de los objetos Objective-C siempre se establecen en 0 (o nulo) cuando asigna un objeto" y no puedo encontrar ninguna otra referencia más clara, por lo que todo es un poco contradictorio para mí.
Kristof Van Landschoot
24

Hice algunos experimentos por mi cuenta 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 usarlo isLandscapecomo una variable pública, con @synthesize, para acceder al controlador de vista principal (que se muestra a continuación). El segundo experimento no @synthesizeusé y yo, obviamente, solía self.isLandscapeobtener 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 dos primeros 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 configuré para que sea 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 variable local [Línea 164] no es SÍ o NO pero no es nula. Supongo que es el valor de basura (aleatorio) con el que no puedes contar. Espero que esto ayude a la próxima persona. Aprendí algo pero espero con ansias los comentarios. ¡Gracias y buena suerte!

Murat Zazi
fuente