2010-05-27 8 views
86

Objective-C'de BOOL değişkeninin varsayılan değeri nedir? Eğer bu çöp için başlatılırVarsayılan değer BOOL

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

yazarsanız

cevap

161

hiçbir varsayılan değer yoktur. Bütün örneği başlatma üzerinde 0 ile doldurulur olarak

Ancak, BOOLIvar için, bu NO için başlatılır.

(Not:.. ARC etkinleştirildiğinde, yerel nesne işaretçileri hep bir varsayılan değer nil sahip olacak, ama BOOL gibi olmayan nesne tiplerinin yerel değişkenler hala çöp başlatılır Local variables set to nil? (Objective-C) bakınız)

+1

Her zaman aynı çöplükte olmak için ivar dışı BOOL'a güvenebilir misiniz? ya da farklı mı? (Yani, bir NSlog ifadesinde '2' tamsayı değerine göre değerlendirdiğimi görüyorum) – bentford

+8

@bentford: Hayır yapamazsın. – kennytm

+0

@bentford ivar, yukarıda belirtildiği gibi "NO" olarak başlatılmıştır. Bence var demek istiyorsun. –

19

Xcode 5.1, OS X Mavericks 10.9.4'ü kullanarak kendi deneylerimi yaptım. ALog bilmeyenler için değiştirilmiş bir NSLog. Her neyse, ilk deney, 'un, @synthesize numaralı ana değişkenin ana görüntüleme denetleyicisi tarafından erişilebilmesi (aşağıda gösterilmektedir) olarak kullanmaktı. İkinci deneyde @synthesize kullanmamıştım ve açıkçası, konsolda aynı sonucu almak için self.isLandscape kullanmıştım. Konsol çıkışı kodumun altında. Üçüncü deneme, bir metodun içinde yerel bir değişken olarak ‘isLandscape’i kullandı.

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

Bu sonuçlar ÜÇÜNCÜ DENEY ‘Islandscape’ in

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 

artık bir özellik oldu ... İlk iki deneyden elde edilenlerdir. Ben özellikleri otomatik olarak bana veya Xcode tarafından başlatılan, tahmin ediyorum

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

Bu sonuçlar üçüncü deneyden gelir ...

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 

, ancak yerel değişkenleri: yerel bir ilginç sonuçlarla değişken olacak biçimde ayarlayın hiç değer almayın. Öyle bile olsa, [Line 164] yerel değişkeni EVET ya da HAYIR değil, sıfır değil mi? Güvenemeyeceğiniz (rastgele) çöp değeridir sanırım. Umarım bu bir sonraki kişiye yardımcı olur. Bir şey öğrendim ama yorumları bekliyorum. Teşekkürler ve iyi şanslar!