Всегда ли инициалы инициализируются в 0? - PullRequest
73 голосов
/ 13 июня 2009

Безопасно ли рассчитывать на int s, всегда инициализируемый в 0 в Objective-C?

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

Ответы [ 3 ]

112 голосов
/ 13 июня 2009

Да, переменные экземпляра класса всегда инициализируются на 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 ++), переменные экземпляра класса также не инициализируются нулями. Вы должны явно инициализировать их в своем конструкторе (ах).

0 голосов
/ 23 мая 2013

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

0 голосов
/ 13 июня 2009

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

...