Jaka jest domyślna wartość BOOL
zmiennej w Objective-C?
Odpowiedzi:
Nie ma żadnego wartość domyślną, jeśli piszesz
-(void)somemethod {
BOOL x; // <--- no default value
Jest zainicjowany jako śmieci.
Jednak w przypadku BOOL
ivar zostanie zainicjowany NO
, ponieważ podczas inicjalizacji cała instancja jest wypełniana wartością 0.
(Uwaga: gdy ARC jest włączone, lokalne wskaźniki obiektów zawsze będą miały wartość domyślną nil
, ale lokalne zmienne typów niebędących obiektami, takie jak BOOL, są nadal inicjowane jako śmieci. Zobacz Zmienne lokalne ustawione na zero? (Cel-C) .)
Przeprowadziłem własne eksperymenty 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 której miałby mieć dostęp nadrzędny kontroler widoku (pokazany poniżej). Drugiego eksperymentu nie @synthesize
użyłem i, oczywiście, self.isLandscape
otrzymałem ten sam wynik w konsoli. Dane wyjściowe konsoli znajdują się poniżej mojego kodu. W trzecim eksperymencie jako zmienną lokalną wewnątrz metody użyto „isLcapes”.
@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);
}
Te wyniki pochodzą z pierwszych dwóch 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 „isLcapes” nie było już własnością. Ustawiłem ją jako zmienną lokalną z interesującymi wynikami:
- (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);
}
Te wyniki pochodzą z 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
Domyślam się, że właściwości są inicjowane automatycznie przeze mnie lub Xcode, ale zmienne lokalne nie mają żadnych wartości. Mimo to, spójrz na [wiersz 164] zmienna lokalna nie jest TAK lub NIE, ale nie jest zerowa? Myślę, że jest to (losowa) wartość śmieci, na którą nie można liczyć. Mam nadzieję, że pomoże to następnej osobie. Dowiedziałem się czegoś, ale nie mogę się doczekać komentarzy. Dzięki i powodzenia!