Инициализируются ли примитивные переменные экземпляра по умолчанию в Objective-C?

В следующем коде безопасно использовать _test и ожидать, что он будет иметь значение NO? Или мне нужно всегда явно инициализировать его в - (id)init?

@implementation Test {
    BOOL _test;
}

person rid    schedule 18.05.2012    source источник


Ответы (2)


Можно с уверенностью предположить, что все переменные экземпляра будут инициализированы до 0.

Однако это не относится к переменным с локальной областью / областью метода, которые, если не инициализировать вручную, будут указывать на мусор.

Для справки в будущем, как указывает Роб Напье, это можно найти в документация для + (id)alloc:

Переменная экземпляра isa нового экземпляра инициализируется структурой данных, описывающей класс; память для всех других переменных экземпляра установлена ​​в 0.

person mmccomb    schedule 18.05.2012
comment
Чтобы предоставить ссылку, прочтите документацию для +alloc. В частности, все ivars, кроме isa, инициализируются значением 0, но вы в любом случае не должны возиться с isa. - person Rob Napier; 18.05.2012
comment
Обратите внимание, что указатели автообъектов фактически инициализируются значением nil при компиляции под ARC. - person jscs; 18.05.2012

Я привык инициализировать его явно, в основном из-за прослеживаемости и удобочитаемости. Но когда вы посмотрите на Определение BOOL, вы увидите, что NO - это не что иное, как #define для 0. Из-за этого, я предполагаю, вы можете смело ожидать, что _test будет NO.

действительно хорошая публикация о логических значениях и их обработке - Objective-C: BOOL vs bool

person Herm    schedule 18.05.2012