Значение по умолчанию BOOL

Что такое значение по умолчанию для переменной BOOL в Objective-C?

Ответ 1

Значение по умолчанию отсутствует, если вы пишете

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

Инициализируется для мусора.

Однако, для a BOOL ivar, он будет инициализирован NO, так как весь экземпляр заполняется 0 при инициализации.

(Примечание. Когда ARC включен, указатели на локальные объекты всегда будут иметь значение по умолчанию nil, но локальные переменные не-объектов типа BOOL по-прежнему инициализируются для мусора. См. Локальные переменные установлены на nil? (Objective-C).)

Ответ 2

Я сделал несколько экспериментов, используя 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

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