Значення за замовчуванням BOOL


Відповіді:


175

Там немає ні значення по замовчуванням , якщо ви пишете

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

Він ініціалізується до сміття.

Однак для BOOL ivar він буде ініціалізований NO, оскільки весь екземпляр заповнюється 0 при ініціалізації.

(Примітка: Коли ARC увімкнено, локальні вказівники на об’єкти завжди матимуть значення за замовчуванням nil, але локальні змінні не об’єктних типів, як BOOL, все ще ініціалізуються до сміття. Див. Локальні змінні, встановлені на нуль? (Objective-C) .)


1
Чи можете ви розраховувати на те, що не ivar BOOL завжди буде одним і тим же сміттям? чи це інше? (тобто. Я бачу, як воно оцінюється як ціле значення "2" в операторі NSlog)
Бентфорд,

8
@bentford: Ні, ти не можеш.
kennytm

@bentford Івар ініціалізований NOяк зазначено вище. Я думаю, ви маєте на увазі var.
Раффі Хатчадуріан,

1
здається тривіальним, але дуже важливо знати! Дякую!!
трильйони

1
@KennyTM "не-об'єктні типи, такі як BOOL з увімкненим ARC, все одно будуть ініціалізовані до сміття". Ви впевнені в цьому? Посилання, яке ви надаєте, говорить: "Змінні екземпляра об’єктів Objective-C завжди встановлюються на 0 (або нуль), коли ви виділяєте об’єкт", і я не можу знайти жодного іншого, більш чіткого, посилання, тому мені все це суперечливо.
Kristof Van Landschoot

24

Я зробив кілька власних експериментів, використовуючи Xcode 5.1, OS X Mavericks 10.9.4. Для тих, хто не знає, ALog - це модифікований NSLog. У будь-якому випадку, перший експеримент повинен був використовуватись isLandscapeяк загальнодоступну змінну, з якою @synthesizeповинен отримати доступ батьківський контролер подання (відображається нижче). Другий експеримент не використовував, @synthesizeі я, очевидно, self.isLandscapeотримував однаковий результат у консолі. Висновок консолі знаходиться нижче мого коду. Третій експеримент використовував 'isLandscape' як локальну змінну всередині методу.

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

Ці результати отримані з перших двох експериментів ...

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

У ТРЕТЬОМ ЕКСПЕРИМЕНТІ «isLandscape» більше не був власністю. Я встановив, що це локальна змінна з цікавими результатами:

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

Це результати третього експерименту ...

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

Я припускаю, що властивості ініціалізуються мною або Xcode автоматично, але локальні змінні взагалі не отримують значень. Незважаючи на це, подивіться на місцеву змінну [Рядок 164] - це не ТАК чи НІ, але вона не дорівнює нулю? Я думаю, що це (випадкове) значення сміття, на яке ви не можете розраховувати. Сподіваюся, це допоможе наступній людині. Я чомусь навчився, але з нетерпінням чекаю коментарів. Дякую та удачі!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.