Valor padrão de BOOL

Respostas:

175

Não valor padrão se você escrever

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

Ele é inicializado como lixo.

No entanto, para um BOOL ivar , ele será inicializado NOcomo, já que toda a instância é preenchida com 0 na inicialização.

(Observação: quando ARC está habilitado, os ponteiros de objeto local sempre terão um valor padrão nil, mas as variáveis ​​locais de tipos não-objeto como BOOL ainda são inicializadas como lixo. Consulte Variáveis ​​locais definidas como nulo? (Objective-C) .)

Kennytm
fonte
1
Você pode contar que o não ivar BOOL será sempre o mesmo lixo? ou é diferente? (ou seja, estou vendo que ele é avaliado como o valor inteiro de '2' em uma instrução NSlog)
bentford
8
@bentford: Não, você não pode.
kennytm
@bentford O ivar é inicializado NOconforme mencionado acima. Acho que você quer dizer var.
Raffi Khatchadourian
1
parece ser trivial, mas muito importante saber! obrigado!!
trilhões de
1
@KennyTM "tipos não-objeto como BOOL com ARC habilitado ainda serão inicializados como lixo". Você tem certeza sobre isso? O link que você fornece diz "Variáveis ​​de instância de objetos Objective-C são sempre definidas como 0 (ou nulo) quando você aloca um objeto" e não consigo encontrar nenhuma outra referência mais clara, então é um pouco contraditório para mim.
Kristof Van Landschoot,
24

Fiz meus próprios experimentos usando o Xcode 5.1, OS X Mavericks 10.9.4. Para quem não conhece, ALog é um NSLog modificado. De qualquer forma, o primeiro experimento foi usar isLandscapecomo uma variável pública, com @synthesize, para ser acessada pelo controlador de visualização pai (exibido abaixo). Segundo experimento não usei @synthesizee eu, obviamente, costumava self.isLandscapeobter o mesmo resultado no console. A saída do console está abaixo do meu código. O terceiro experimento usou 'isLandscape' como uma variável local dentro de um 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);
}

Esses resultados são dos dois primeiros 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

No TERCEIRO EXPERIMENTO, 'isLandscape' não era mais uma propriedade. Eu a defini como uma variável local com resultados interessantes:

- (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);
}

Esses resultados são do terceiro 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

Estou supondo que as propriedades são inicializadas por mim ou pelo Xcode automaticamente, mas as variáveis ​​locais não recebem nenhum valor. Mesmo assim, observe a [Linha 164] a variável local não é SIM ou NÃO, mas não é nula? Eu acho que é o valor de lixo (aleatório) com o qual você não pode contar. Espero que isso ajude a próxima pessoa. Aprendi alguma coisa, mas estou ansioso por comentários. Obrigado e boa sorte!

Murat Zazi
fonte