Значение по умолчанию 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

1
кажется банальным, но это очень важно знать! Спасибо!!
триллионы

1
@KennyTM «Необъектные типы, такие как BOOL с включенным ARC, все равно будут инициализированы как мусор». Вы уверены, что? В предоставленной вами ссылке говорится: «Переменные экземпляра объектов Objective-C всегда устанавливаются в 0 (или ноль), когда вы выделяете объект», и я не могу найти никакой другой, более четкой ссылки, поэтому все это немного противоречит мне.
Кристоф Ван Ландсхут,

1
в моем случае для локальной переменной BOOL установлено значение 0, это НЕТ. но при сборке в режиме выпуска будет ДА.
ngn999

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.