Объектное выделение
То, когда Вы выделяете объект, часть того, что происходит, - то, что Вы могли бы ожидать учитывая срок. Какао выделяет достаточно памяти для объекта от области виртуальной памяти приложения. Вычислять, сколько памяти для выделения это принимает переменные экземпляра объекта во внимание — включая их типы и порядок — как указано классом объекта.
Для выделения объекта Вы отправляете сообщение alloc
или allocWithZone:
к классу объекта. В свою очередь, Вы получаете «необработанный» (неинициализированный) экземпляр класса. alloc
вариант метода использует зону приложения по умолчанию. Зона является выровненной страницей областью памяти для содержания связанных объектов и данных, выделенных приложением. См. Усовершенствованное Руководство по программированию управления памятью для получения дополнительной информации о зонах.
Сообщение выделения делает другие важные вещи помимо выделения памяти:
Это инициализирует объект
isa
переменная экземпляра для указания на класс объекта, объект периода выполнения самостоятельно, компилирующийся от определения класса.Это инициализирует все другие переменные экземпляра для обнуления (или к эквивалентному типу для нуля, такой как
nil
,NULL
, и0.0
).
Объект isa
переменная экземпляра наследована от NSObject
, таким образом, это характерно для всех объектов Какао. После наборов выделения isa
к классу объекта объект интегрируется в представление времени выполнения иерархии наследования и текущую сеть объектов (класс и экземпляр), которые составляют программу. Следовательно объект может найти любую информацию, в которой он нуждается во время выполнения, такое как место другого объекта в иерархии наследования, протоколы, которым другие объекты приспосабливают, и расположение реализаций метода, которые он может выполнить в ответ на сообщения.
Таким образом, выделение не только выделяет память для объекта, но и инициализирует два маленьких, но очень важных атрибута любого объекта: isa
переменная экземпляра и сохранять количество. Это также обнуляет все остающиеся переменные экземпляра. Но полученный объект еще не применим. Инициализация методов такой как init
должен все же инициализировать объекты с их представляющими параметрами и возвратить функциональный объект.