Ints всегда инициализируются до 0?


безопасно ли рассчитывать на ints всегда инициализируется до 0 в Objective-C?

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

3 72

3 ответа:

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

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


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

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


но это только true для переменных экземпляра класса; это также верно для типов POD, объявленных в глобальной области:

// At global scope
int a_global_var;  // guaranteed to be 0
NSString *a_global_string;  // guaranteed to be nil

за одним исключением, это не true для локальных переменных или для данных, выделенных с помощью malloc() или realloc(); это верно для calloc() С calloc() явно обнуляет память, которую он выделяет.

единственное исключение является ли это, когда включен автоматический подсчет ссылок (ARC), указатели стека на объекты Objective-C неявно инициализируются в nil, однако, это все еще хорошая практика, чтобы явно инициализировать их в nil. Из переход к заметкам о выпуске дуги:

переменные стека инициализируются с помощью nil

использование Arc, strong, weak и autoreleasing переменные стека теперь неявно инициализируются с помощью nil

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

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

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