2010-05-27 20 views

Odpowiedz

161

Jest żadna wartość domyślna jeśli piszesz

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

jest inicjowane śmieci.

Jednak dla BOOLivar, zostanie zainicjowane NO jako całość przykład jest wypełniona 0 inicjalizacji.

(Uwaga:.. Kiedy ARC jest włączona, lokalne obiektów wskaźniki zawsze będzie mieć wartość domyślną nil, ale zmienne lokalne typów nie obiektowych jak BOOL nadal są inicjowane na śmieci Zobacz Local variables set to nil? (Objective-C))

+1

Czy możesz liczyć na to, że BOOL non ivar będzie zawsze tym samym śmieciem? czy jest inaczej? (tzn. widzę, że ocenia on wartość całkowitą "2" w instrukcji NSlog) – bentford

+8

@bentford: Nie, nie możesz. – kennytm

+0

@bentford Nazwa ivar jest inicjowana na "NIE", jak wspomniano powyżej. Myślę, że masz na myśli var. –

19

Zrobiłem kilka własnych eksperymentów przy użyciu Xcode 5.1, OS X Mavericks 10.9.4. Dla tych, którzy nie wiedzą, ALog to zmodyfikowany NSLog. W każdym razie, pierwszym eksperymentem było użycie isLandscape jako zmiennej publicznej, z @synthesize, do uzyskania dostępu przez nadrzędny kontroler widoku (pokazany poniżej). W drugim eksperymencie nie użyto @synthesize, a ja, oczywiście, użyłem self.isLandscape, aby uzyskać ten sam wynik w konsoli. Dane wyjściowe konsoli znajdują się poniżej mojego kodu. Trzeci eksperyment użył "isLandscape" jako zmiennej lokalnej w metodzie.

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

Wyniki te pochodzą z dwóch pierwszych eksperymentów ...

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 

W trzecim doświadczeniu „isLandscape” nie była już własnością. I ustawić ją jako zmienną lokalną z ciekawszych wyników:

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

Wyniki te są od trzeciego eksperymentu ...

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 

Zgaduję Właściwości się zainicjowana przez mnie lub Xcode automatycznie, ale zmienne lokalne nie otrzymują żadnych wartości. Mimo to, spójrz na [Line 164] zmienna lokalna nie jest TAK lub NIE, ale nie jest zerowa? Przypuszczam, że jest to (losowa) wartość śmieci, na którą nie można liczyć. Mam nadzieję, że pomoże to następnej osobie. Nauczyłem się czegoś, ale czekam na komentarze. Dzięki i życzę powodzenia!