Antworten:
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) .)
NO
wie oben erwähnt initialisiert . Ich denke du meinst var.
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 isLandscape
als öffentliche Variable zu verwenden @synthesize
, auf die der übergeordnete Ansichts-Controller zugreifen kann (siehe unten). Das zweite Experiment wurde nicht verwendet, @synthesize
und ich habe offensichtlich self.isLandscape
das 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!