Valore predefinito di BOOL


Risposte:


175

Non esiste un valore predefinito se scrivi

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

Viene inizializzato in Garbage.

Tuttavia, per un BOOL ivar , verrà inizializzato a NO, poiché l'intera istanza viene riempita con 0 durante l'inizializzazione.

(Nota: quando ARC è abilitato, i puntatori agli oggetti locali avranno sempre un valore predefinito nil, ma le variabili locali di tipi non di oggetti come BOOL sono ancora inizializzate come garbage. Vedere Variabili locali impostate su nil? (Objective-C) .)


1
Puoi contare sul fatto che non ivar BOOL sia sempre la stessa spazzatura? o è diverso? (ad esempio, vedo che restituisce il valore intero di "2" in un'istruzione NSlog)
bentford

8
@ Bentford: No, non puoi.
kennytm

@bentford L'ivar viene inizializzato NOcome menzionato sopra. Penso che intendi var.
Raffi Khatchadourian

1
sembra banale ma molto molto importante da sapere! Grazie!!
trilioni

1
@KennyTM "i tipi non-oggetto come BOOL con ARC abilitato verranno comunque inizializzati come garbage". Sei sicuro di questo? Il collegamento che fornisci dice "Le variabili di istanza degli oggetti Objective-C sono sempre impostate su 0 (o zero) quando assegni un oggetto" e non riesco a trovare nessun altro riferimento più chiaro, quindi è tutto un po 'contraddittorio per me.
Kristof Van Landschoot

24

Ho fatto alcuni esperimenti utilizzando Xcode 5.1, OS X Mavericks 10.9.4. Per chi non lo sapesse ALog è un NSLog modificato. Ad ogni modo, il primo esperimento è stato quello di utilizzare isLandscapecome variabile pubblica, con @synthesize, a cui si accede dal controller della vista genitore (mostrato sotto). Il secondo esperimento non usavo @synthesizee io, ovviamente, ero solito self.isLandscapeottenere lo stesso risultato nella console. L'output della console è sotto il mio codice. Il terzo esperimento ha utilizzato "isLandscape" come variabile locale all'interno di un metodo.

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

Questi risultati provengono dai primi due esperimenti ...

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

Nel TERZO ESPERIMENTO "isLandscape" non era più una proprietà. L'ho impostata come variabile locale con risultati interessanti:

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

Questi risultati provengono dal terzo esperimento ...

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

Immagino che le proprietà vengano inizializzate automaticamente da me o da Xcode, ma le variabili locali non ottengono alcun valore. Anche così, guarda [Riga 164] la variabile locale non è SI o NO ma non è nulla? Immagino sia il valore di spazzatura (casuale) su cui non puoi contare. Spero che questo aiuti la prossima persona. Ho imparato qualcosa ma attendo con ansia i commenti. Grazie e buona fortuna!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.