Массив C против массива Obj-C - PullRequest
1 голос
/ 08 марта 2011

Когда массив создается в Objective-C с использованием alloc init, как управляется память при добавлении объектов в массив?

Я хотел бы знать, как это относится к C при создании массиваи malloc, выделенный размер должен быть размером ожидаемого массива или память массива должна быть перераспределена.

Как они соотносятся или как понять, как работает код Си.

Внутренняя обработка памяти массивов target-c при добавлении объектов или как это работает?

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Массив Objective-C следует тем же правилам управления памятью, что и другие объекты Objective-C.Если вы выделите его, вам нужно будет его освободить.

C-массивы и массивы Objective-C похожи по своей концепции, но реализованы совершенно по-разному.Массив AC - это непрерывный блок памяти с очень немногим, кроме языковой конструкции, управляющей тем, как вы его используете.Массивы Objective-C - это объекты со значительной встроенной функциональностью.Они динамически изменяют размер самих себя (если они изменчивы) для размещения добавленных элементов.Они правильно сохраняют и освобождают предметы, которые хранят.Они могут сортировать себя, фильтровать себя, вставлять объекты, удалять объекты и т. Д. Вы не должны делать никаких предположений о том, как они реализованы.

Документация Apple должна дать вам гораздо лучшее представление о том, что возможно с Objective-Cмассивы (и пока вы это делаете, посмотрите и на другие классы коллекций).Начните читать здесь: Темы программирования коллекций

1 голос
/ 08 марта 2011

NSArrays (и, соответственно, NSMutableArrays) сохраняют добавленные к ним объекты и отправляют им все сообщения об освобождении, когда сам массив освобождается.

Результатом этого является то, что общим шаблоном является выделение объекта, его инициализация, передача его в массив, а затем его освобождение. Поскольку массив сохраняет его для себя, он будет работать столько же, сколько сам массив, или пока вы не дадите указание массиву избавиться от него. Вам никогда не потребуется отправлять ему другое сообщение о выпуске, об этом заботится механизм массива.

Я бы предположил, что изменяемые массивы реализованы как нечто вроде связанного списка, поэтому их можно легко расширить и свернуть позже. Это просто список указателей и, возможно, небольшие метаданные. Поскольку он не создает каких-либо объектов, переданных ему, он просто привязывает их к себе, все, что ему нужно для этого, - это место для указателя на объект.

...