Risposte:
Non esiste un valore predefinito se scrivi
-(void)somemethod {
BOOL x; // <--- no default value
Viene inizializzato in Garbage.
Tuttavia, per un BOOL
ivar , verrà inizializzato a NO
, poiché l'intera istanza viene riempita con 0 durante l'inizializzazione.
(Nota: quando ARC è abilitato, i puntatori agli oggetti locali avranno sempre un valore predefinito nil
, ma le variabili locali di tipi non di oggetti come BOOL sono ancora inizializzate come garbage. Vedere Variabili locali impostate su nil? (Objective-C) .)
NO
come menzionato sopra. Penso che intendi var.
Ho fatto alcuni esperimenti utilizzando Xcode 5.1, OS X Mavericks 10.9.4. Per chi non lo sapesse ALog è un NSLog modificato. Ad ogni modo, il primo esperimento è stato quello di utilizzare isLandscape
come variabile pubblica, con @synthesize
, a cui si accede dal controller della vista genitore (mostrato sotto). Il secondo esperimento non usavo @synthesize
e io, ovviamente, ero solito self.isLandscape
ottenere lo stesso risultato nella console. L'output della console è sotto il mio codice. Il terzo esperimento ha utilizzato "isLandscape" come variabile locale all'interno di un metodo.
@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);
}
Questi risultati provengono dai primi due esperimenti ...
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
Nel TERZO ESPERIMENTO "isLandscape" non era più una proprietà. L'ho impostata come variabile locale con risultati interessanti:
- (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);
}
Questi risultati provengono dal terzo esperimento ...
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
Immagino che le proprietà vengano inizializzate automaticamente da me o da Xcode, ma le variabili locali non ottengono alcun valore. Anche così, guarda [Riga 164] la variabile locale non è SI o NO ma non è nulla? Immagino sia il valore di spazzatura (casuale) su cui non puoi contare. Spero che questo aiuti la prossima persona. Ho imparato qualcosa ma attendo con ansia i commenti. Grazie e buona fortuna!