Всегда ли инициализируются ints?

Можно ли считать, что int всегда инициализируется 0 в Objective-C?

Более конкретно, когда объект с int ivars был вновь создан, можно ли предположить, что его ivars имеет значение 0?

Ответ 1

Да, переменные экземпляра класса всегда инициализируются на 0 (или nil, NULL или false, в зависимости от точного типа данных). См. Objective-C 2.0 Язык программирования:

Метод alloc динамически выделяет память для новых экземпляров экземпляров объектов и инициализирует их все 0-все, то есть за исключением переменной isa, которая связывает новый экземпляр с его классом.


EDIT 2013-05-08
Apple, похоже, удалила вышеупомянутый документ (теперь он связан с The Wayback Machine). В текущем активном документе Программирование Objective-C содержит аналогичную ссылку:

У метода alloc есть еще одна важная задача, которая заключается в том, чтобы очистить память, выделенную для свойств объектов, установив их в ноль. Это позволяет избежать обычной проблемы с памятью, содержащей мусор, из того, что было ранее сохранено, но недостаточно для инициализации объекта полностью.


Однако это справедливо только для переменных класса; это также верно для типов 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

В С++ (и объекты С++, используемые в Objective-C ++) переменные экземпляра класса также не инициализируются нулем. Вы должны явно инициализировать их в своих конструкторах.

Ответ 2

Я не думаю, что вы должны принимать какие-либо значения для инициализации. Если вы строите логику вокруг значения "0", вы должны установить ее, чтобы быть уверенным.

Ответ 3

Да, в C глобальные vars инициализируются до нуля. В Objective-C даже локальные вары инициализируются до нуля. Вы можете рассчитывать на это.