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