Standardwert von BOOL

Antworten:

175

Es gibt keinen Standardwert, wenn Sie schreiben

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

Es wird auf Müll initialisiert.

Bei einem BOOL ivar wird es jedoch auf initialisiert NO, da die gesamte Instanz bei der Initialisierung mit 0 gefüllt wird.

(Hinweis: Wenn ARC aktiviert ist, haben lokale Objektzeiger immer einen Standardwert nil, aber lokale Variablen von Nicht-Objekttypen wie BOOL werden weiterhin mit Garbage initialisiert. Siehe Lokale Variablen auf Null gesetzt? (Objective-C) .)

kennytm
quelle
1
Können Sie sich darauf verlassen, dass der Nicht-Ivar-BOOL immer der gleiche Müll ist? oder ist es anders (dh ich sehe, dass es in einer NSlog-Anweisung den ganzzahligen Wert von '2' ergibt)
bentford
8
@entford: Nein, kannst du nicht.
Kennytm
@entford Der ivar wird NOwie oben erwähnt initialisiert . Ich denke du meinst var.
Raffi Khatchadourian
1
scheint trivial zu sein, aber sehr, sehr wichtig zu wissen! Vielen Dank!!
Billionen
1
@KennyTM "Nicht-Objekttypen wie BOOL mit aktiviertem ARC werden weiterhin mit Garbage initialisiert". Bist du dir da sicher? Der von Ihnen bereitgestellte Link lautet "Instanzvariablen von Objective-C-Objekten werden beim Zuweisen eines Objekts immer auf 0 (oder Null) gesetzt", und ich kann keine andere, klarere Referenz finden, daher ist alles ein bisschen widersprüchlich für mich.
Kristof Van Landschoot
24

Ich habe einige eigene Experimente mit Xcode 5.1, OS X Mavericks 10.9.4 durchgeführt. Für diejenigen, die ALog nicht kennen, ist ALog ein modifiziertes NSLog. Wie auch immer, das erste Experiment bestand darin, es isLandscapeals öffentliche Variable zu verwenden @synthesize, auf die der übergeordnete Ansichts-Controller zugreifen kann (siehe unten). Das zweite Experiment wurde nicht verwendet, @synthesizeund ich habe offensichtlich self.isLandscapedas gleiche Ergebnis in der Konsole erzielt. Die Konsolenausgabe befindet sich unter meinem Code. Das dritte Experiment verwendete 'isLandscape' als lokale Variable innerhalb einer Methode.

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

Diese Ergebnisse stammen aus den ersten beiden Experimenten…

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

Im DRITTEN EXPERIMENT war 'isLandscape' keine Eigenschaft mehr. Ich habe es als lokale Variable mit interessanten Ergebnissen festgelegt:

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

Diese Ergebnisse stammen aus dem dritten Experiment…

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

Ich vermute, dass Eigenschaften von mir oder Xcode automatisch initialisiert werden, aber lokale Variablen erhalten überhaupt keine Werte. Schauen Sie sich trotzdem die lokale Variable [Zeile 164] an, die nicht JA oder NEIN ist, aber nicht Null ist. Ich denke, es ist der (zufällige) Müllwert, auf den Sie nicht zählen können. Ich hoffe das hilft der nächsten Person. Ich habe etwas gelernt, freue mich aber auf Kommentare. Danke und viel Glück!

Murat Zazi
quelle