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

Хотя я никогда никого не отворачивал от учебных пособий по Haskell, они могут быть немного ошеломляющими, если вы разработчик в стиле ООП и не знаете, почему вы хотите жить в функциональном мире. .

Я выступил с докладом «скаляр для всех нас», который подходит к скалазу, хотя примеры, с которыми все знакомы: памятка (Памятка в скалазе), проверка домена (валидация в скалазе) и т. Д. Таким образом, «вариант использования» «Ясно и могу начать учиться решать знакомые проблемы, используя силу скалаза.

73
задан Josh Caswell 8 January 2013 в 06:49
поделиться

2 ответа

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

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


РЕДАКТИРОВАТЬ 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 ++) переменные экземпляра класса также не инициализируются нулем. Вы должны явно инициализировать их в своих конструкторах.

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

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

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

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

112
ответ дан 24 November 2019 в 12:22
поделиться

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

-1
ответ дан 24 November 2019 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: