Чи безпечно розраховувати на те, що int
s завжди ініціалізується до 0 у Objective-C?
Більш конкретно, коли об’єкт із int
ivars було нещодавно створено, чи безпечно припустити, що його ivars мають значення 0?
Відповіді:
Так, змінний екземпляр класу завжди ініціалізується в 0 (або nil
, NULL
або false
, в залежності від конкретного типу даних). Дивіться Мова програмування Objective-C 2.0 :
alloc
Метод динамічно виділяє пам'ять для змінних екземпляра нового об'єкта і ініціалізує їх всіх до 0-все, що є, крімisa
змінної , яка з'єднує новий екземпляр цього класу.
EDIT 08.05.2013
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
У C ++ (і об'єкти C ++, що використовуються в Objective-C ++), змінні екземпляра класу також не ініціалізовані нулем. Ви повинні явно ініціалізувати їх у своїх конструкторах.
id
також ініціалізуються рівним нулю.
int
, NSUInteger
, CGFloat
, float
, bool
, BOOL
, char
і т.д.) все инициализируется в 0 представлено в цих типах.
Я не думаю, що вам слід приймати будь-які значення для ініціалізації. Якщо ви будуєте логіку навколо значення "0", ви повинні встановити це, щоб бути впевненим.
Так, у C глобальні вари ініціалізуються до нуля. У Objective-C навіть локальні вари ініціалізуються до нуля. На це можна розраховувати.