2010-05-27 10 views

risposta

161

Non v'è alcun valore di default se si scrive

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

E 'inizializzato a spazzatura.

Tuttavia, per un BOOLivar, verrà inizializzato a NO, come l'intera istanza è riempito con 0 inizializzazione.

(Nota:.. Quando ARC è abilitato, locali puntatori oggetto sarà sempre avere un valore predefinito nil, ma le variabili locali di tipo non-oggetto come BOOL sono ancora inizializzato a spazzatura Vedere Local variables set to nil? (Objective-C))

+1

Riesci a contare sul BOX non ivar per essere sempre la stessa spazzatura? o è diverso? (cioè sto vedendo valutare il valore intero di '2' in un'istruzione NSlog) – bentford

+8

@bentford: No, non è possibile. – kennytm

+0

@bentford L'ivar è inizializzato su 'NO' come menzionato sopra. Penso che tu intenda var. –

19

Ho fatto alcuni miei esperimenti usando Xcode 5.1, OS X Mavericks 10.9.4. Per coloro che non sanno che ALog è un NSLog modificato. Ad ogni modo, il primo esperimento era usare isLandscape come variabile pubblica, con @synthesize, a cui accedere dal controllore della vista genitore (visualizzato sotto). Il secondo esperimento non ha utilizzato @synthesize e, ovviamente, ho utilizzato self.isLandscape per ottenere 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 sono 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 

nell'esperimento TERZO ‘isLandscape’ non era più una proprietà. Ho impostato ad essere una 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 sono da 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 

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