Разница между [массивом NSMutableArray] и [[NSMutableArray alloc] init] - PullRequest
54 голосов
/ 24 марта 2011

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

NSMutableArray *array = [NSMutableArray array];

и

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

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

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

Спасибо

Ответы [ 2 ]

36 голосов
/ 24 марта 2011

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

31 голосов
/ 24 марта 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...