Domyślna wartość BOOL

Odpowiedzi:

176

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) .)

kennytm
źródło
1
Czy możesz liczyć na to, że BOOL inny niż ivar zawsze będzie tym samym śmieciem? czy jest inaczej? (tj. widzę, że oblicza się na wartość całkowitą „2” w instrukcji NSlog)
bentford
8
@bentford: Nie, nie możesz.
kennytm
1
wydaje się trywialne, ale bardzo ważne, aby wiedzieć! dzięki!!
biliony
1
@KennyTM „typy niebędące obiektami, takie jak BOOL z włączonym ARC, nadal będą inicjowane jako śmieci”. Czy jesteś tego pewien? Podany link mówi: „Zmienne instancji obiektów Objective-C są zawsze ustawione na 0 (lub zero), kiedy przydzielasz obiekt” i nie mogę znaleźć żadnego innego, jaśniejszego odniesienia, więc wszystko jest dla mnie trochę sprzeczne.
Kristof Van Landschoot
1
w moim przypadku zmienna lokalna BOOL jest ustawiona na 0, to jest NIE. ale kiedy budujesz w trybie wydania, będzie TAK.
ngn999
24

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 isLandscapejako zmiennej publicznej z @synthesize, do której miałby mieć dostęp nadrzędny kontroler widoku (pokazany poniżej). Drugiego eksperymentu nie @synthesizeużyłem i, oczywiście, self.isLandscapeotrzymał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!

Murat Zazi
źródło