Можно ли считать, что 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 даже локальные вары инициализируются до нуля. Вы можете рассчитывать на это.