2010-05-16 2 views
0

И снова мой массив массивов ....Правильный способ очистить/освободить массив массивов

Когда у меня есть массив «х», который содержит несколько экземпляров массива «у», как я очищаю/освободить его, не рискуя утечками памяти?

следующие звонки достаточны?

(а) очистка массива

[x removeAllObjects]; 

(б) рилизинг массив

[x release]; 

или мне нужно, чтобы перечислить массив, такие как:

(с) очистки массив

for(int i=0;i<x.count;i++) 
    [[x objectAtIndex:i] release]; 
    [x removeAllObjects]; 

(d) рилизинг массив со

for(int i=0;i<x.count;i++) 
    [[x objectAtIndex:i] release]; 
    [x release]; 

заранее спасибо

ответ

6

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

Никогда не делайте [[x objectAtIndex:i] release] - вы не сохранили возвращенный объект, так что вы отбросите его счет сохранения, выпустив его.

+1

iFioh: (a) и (b) действительны; (c) и (d) не являются (они перевыпускают объекты в массиве, что приведет к сбоям). Если вы хотите сохранить массив, чтобы позже поместить в него объекты, используйте (a). Если вы хотите полностью избавиться от массива (как в 'dealloc'), используйте (b). –

-1

Лучший способ удостовериться, что утечка памяти не возникает из-за того, что после добавления этого объекта в массив вы должны освободить его, чтобы сохранить значение объекта равным 1, и только массив удерживает его. Таким образом, когда вы освободите массив, он отправит сообщение о выпуске всем объектам в массиве, а keepCount из всех объектов станет 0, и они будут dealloc

+2

Счет сохранения может быть или не быть 1, как только объект будет добавлен в массив. Возможно, вам может понадобиться выпустить его после добавления в массив. Наконец, объекты могут или не могут быть освобождены после удаления массива. Никогда не считайте количество удержаний как абсолютное значение, только то, что вы меняете. Счетчик удержания объекта в любой момент времени является деталью реализации, которая часто выходит за рамки вашего контроля. – bbum

+0

Возможно, вы неправильно прочитали его, но я не говорю, что когда он будет удален из массива, он будет освобожден. Я просто имею в виду, что если вы удалите его, и он получит keepCount 0, он будет dealloc (не сразу, а когда-нибудь, а также зависит от системы). Во всяком случае, я думаю, что это должно быть хорошей практикой и напомнить людям, что когда они добавят объект в массив, keepCount будет увеличиваться, поэтому, если они хотят убедиться, что только массив удерживает этот объект, они должны освободить этот объект – vodkhang

+1

@vadkhang: дело в том, что если вы даже думаете с точки зрения keepCount, вы делаете это неправильно. Вы должны думать только с точки зрения собственности. Например, в d выше, если вы спросите: «Я владею ссылкой, которую я получил от objectAtIndex:? Ответ« нет », поэтому ясно, что релиз внутри цикла неверен. – JeremyP

Смежные вопросы