Значение по умолчанию BOOL - PullRequest
90 голосов
/ 27 мая 2010

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

Ответы [ 2 ]

171 голосов
/ 27 мая 2010

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

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

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

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

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

23 голосов
/ 28 августа 2014

Я провел несколько собственных экспериментов с использованием 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] - это не ДА или НЕТ, но не ноль? Я думаю, что это (случайное) значение мусора, на которое вы не можете рассчитывать. Я надеюсь, что это поможет следующему человеку. Я кое-что узнал, но с нетерпением жду комментариев. Спасибо и удачи!

...