alloc / init и установка переменных экземпляра - PullRequest
2 голосов
/ 03 декабря 2009

Насколько я понимаю, в дополнение к выделению памяти, alloc устанавливает все переменные экземпляра (за исключением переменной isa) в ноль или эквивалентный тип для нуля, такой как nil, NULL и 0.0.

Но я недавно прочитал следующее о init:

Инициализация устанавливает экземпляр переменные объекта до разумного и полезные начальные значения.

Я немного сбит с толку относительно того, что означают "разумные и полезные начальные значения" ....

Если alloc уже установил значения на ноль, init изменяет ли эти значения каким-либо образом?

Ответы [ 2 ]

3 голосов
/ 03 декабря 2009

Если alloc уже установил значения в ноль, init изменяет эти значения каким-либо образом?

Конечно.

Например, у вас может быть объект, представляющий прямоугольник с иварами для представления ширины и высоты; в init вы можете инициализировать эти ивары по умолчанию, скажем, 300x200.

Это все, о чем они говорят.

Если вы спрашиваете, инициализирует ли метод NSObject -init значения иваров вашего подкласса какими-либо ненулевыми значениями, ответ, конечно же, нет.

0 голосов
/ 03 декабря 2009

Да, это вполне возможно. Например, структура данных может иметь переменные-члены, которые требуют динамической памяти, которая также выделяется и инициализируется. Вызов alloc зарезервирует место для переменных-членов, а вызов init сделает эти значения полезными (например, перераспределение и инициализация).

alloc и init являются отдельными, потому что вы можете иметь несколько подпрограмм init для класса, которые инициализируют объект различными способами.

Вы также можете позвонить alloc и init одновременно, позвонив по номеру new. Таким образом, следующие две строки эквивалентны:

[[NSObject alloc] init];
[NSObject new];
...