Подтвердить что ты не робот

Разница между [NSMutableArray array] vs [[NSMutableArray alloc] init]

может кто-то сказать мне разницу в объявлении изменяемого массива с помощью:

NSMutableArray *array = [NSMutableArray array];

и

NSMutableArray *array = [[NSMutableArray alloc] init];

Потому что в начале я объявлял все свои массивы с помощью alloc, и если в конце некоторой функции я вернул массив, созданный с помощью alloc, мне пришлось автоопределить этот массив из-за проблем с утечкой памяти.

Теперь, используя первое объявление, мне не нужно ничего отпускать.

Спасибо

4b9b3361

Ответ 1

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

Это точно правильно, когда вы "продаете" объект. Но в других случаях, когда вы создаете объект на iOS, где у вас есть выбор между получением готового объекта с автореализацией и выделением вызова с последующим выпуском, Apple хочет, чтобы вы использовали alloc и release, поскольку это сохраняет время жизни объекта короткий и под вашим контролем.

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

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

EDIT - 12/18/2011: Но с iOS 5 и приходом ARC механизм авторекламы намного эффективнее, и нет такой вещи, как release, поэтому различие между alloc-init и конструктором удобства, вендинг автореализованного объекта становится спорным. (Также он теперь представляет собой блок @autoreleasepool, а не объект автоопределения (псевдо).)

Ответ 2

array метод класса сам по себе создает автореализованный массив, то есть вам не нужно (и не должно) выпускать его вручную.