Да, переменные экземпляра класса всегда инициализируются на 0 (или nil
, NULL
или false
, в зависимости от точного типа данных). См. Язык программирования Objective-C 2.0 :
Метод alloc
динамически распределяет память для переменных экземпляра нового объекта и инициализирует их все в 0 - все, кроме переменной isa
, которая связывает новый экземпляр с его классом.
РЕДАКТИРОВАТЬ 2013-05-08
Apple, похоже, удалила вышеуказанный документ (теперь связанный с The Wayback Machine). (В настоящее время) активный документ Программирование с Objective-C содержит аналогичную цитату:
У метода alloc
есть еще одна важная задача - очистить память, выделенную для свойств объекта, установив их в ноль. Это позволяет избежать обычной проблемы памяти, содержащей мусор из того, что было сохранено ранее, но недостаточно для полной инициализации объекта.
Однако, это только true для переменных экземпляра класса; это также верно для типов POD, объявленных в глобальной области видимости:
// At global scope
int a_global_var; // guaranteed to be 0
NSString *a_global_string; // guaranteed to be nil
За одним исключением, не верно для локальных переменных или для данных, выделенных с malloc()
или realloc()
; это верно для calloc()
, поскольку calloc()
явно обнуляет выделяемую память.
Единственное исключение состоит в том, что при включении автоматического подсчета ссылок (ARC) указатели стека на объекты Objective-C неявно инициализируются равными nil
; тем не менее, по-прежнему рекомендуется явно инициализировать их nil
. От Переход к примечаниям к выпуску ARC :
Переменные стека инициализируются с nil
При использовании ARC сильные, слабые и автоматически высвобождаемые переменные стека теперь неявно инициализируются с nil
В C ++ (и объектах C ++, используемых в Objective-C ++), переменные экземпляра класса также не инициализируются нулями. Вы должны явно инициализировать их в своем конструкторе (ах).