Чи завжди ints ініціалізовані до 0?


74

Чи безпечно розраховувати на те, що ints завжди ініціалізується до 0 у Objective-C?

Більш конкретно, коли об’єкт із intivars було нещодавно створено, чи безпечно припустити, що його ivars мають значення 0?

Відповіді:


114

Так, змінний екземпляр класу завжди ініціалізується в 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 ++), змінні екземпляра класу також не ініціалізовані нулем. Ви повинні явно ініціалізувати їх у своїх конструкторах.


3
Пляма на. Однак той факт, що люди часто задаються питаннями про цю деталь, може бути достатньою підставою для того, щоб чіткіше ставитись до ініціалізації змінних, можливо, це "безпечніший" вибір. Ініціалізація до 0 / nil / NULL ніколи нікому не нашкодить ... :-)
Квін Тейлор

4
@PsychoDad Мій досвід протилежний.
titaniumdecoy

1
@Pang: Виправлено зараз. На жаль, Apple видалила оригінальний документ AFAICT "Мова програмування Objective-C 2.0".
Адам Розенфілд,

1
У ARC місцеві змінні типу idтакож ініціалізуються рівним нулю.
LearnCocos2D

1
@ n00b Програміст: Так. У ситуаціях, описаних вище, усі змінні "нульово ініціюються" будь-яким способом, що означає для їх відповідних типів даних. Арифметичні типи ( int, NSUInteger, CGFloat, float, bool, BOOL, charі т.д.) все инициализируется в 0 представлено в цих типах.
Адам Розенфілд,

-1

Я не думаю, що вам слід приймати будь-які значення для ініціалізації. Якщо ви будуєте логіку навколо значення "0", ви повинні встановити це, щоб бути впевненим.


Я припускаю, що ми можемо розглядати це як дійсну відповідь на C ++, тоді як відповідь Адама стосується Objective-C?
Felixyz

11
Відповідь Адама на ціль C є абсолютно правильною - ціль C абсолютно гарантує, що ivars встановлюються рівними нулю / NULL / false / 0 при розподілі, і цілком розумно прийняти та використовувати цей факт. Наприклад, це дозволяє тривіальну ліниву ініціалізацію ivars NSMultableArray * з [масивом NSMultableArray або новим], коли вони помічені як нульові. У поєднанні з ціллю C гарантування [(NSMultableArray *) count] повертає 0, ви часто можете відкласти ініціалізацію ще більше. Навчіться любити так, як це робить ціль С, а не просто боротися проти її відмінностей.
Пітер Н Льюїс,

-2

Так, у C глобальні вари ініціалізуються до нуля. У Objective-C навіть локальні вари ініціалізуються до нуля. На це можна розраховувати.


1
Відповідь @ AdamRosenfield прямо суперечить вашому твердженню про те, що навіть локальні вари ініціалізовані нулем. Хто помиляється?
Mark Amery
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.