Можно ли считать, что int всегда инициализируется 0 в Objective-C?
Более конкретно, когда объект с int ivars был вновь создан, можно ли предположить, что его ivars имеет значение 0?
Можно ли считать, что int всегда инициализируется 0 в Objective-C?
Более конкретно, когда объект с int ivars был вновь создан, можно ли предположить, что его ivars имеет значение 0?
Да, переменные экземпляра класса всегда инициализируются на 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 ++) переменные экземпляра класса также не инициализируются нулем. Вы должны явно инициализировать их в своих конструкторах.
Я не думаю, что вы должны принимать какие-либо значения для инициализации. Если вы строите логику вокруг значения "0", вы должны установить ее, чтобы быть уверенным.
Да, в C глобальные vars инициализируются до нуля. В Objective-C даже локальные вары инициализируются до нуля. Вы можете рассчитывать на это.