Ints всегда инициализируются до 0?
безопасно ли рассчитывать на int
s всегда инициализируется до 0 в Objective-C?
более конкретно, когда объект с int
Ивар был недавно создан, можно ли предположить, что его ивары имеют значение 0?
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++) переменные экземпляра класса также не ноль-инициализировать. Необходимо явно инициализировать их в конструкторе(ы).