Правильный способ удаления массива объектов в Objective C - PullRequest
1 голос
/ 31 июля 2011

Я новичок в Objective-C и до сих пор не совсем понимаю управление памятью.У меня есть NSMutableArray из указателей ...

NSMutableArray *itemArray;

во всей моей программе, я добавляю элементы к нему.

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
//end loop

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

//start loop
[[itemArray objectAtIndex:i] release];
//end loop
[itemArray removeAllObjects];

Ответы [ 3 ]

5 голосов
/ 31 июля 2011

Реальная проблема, с которой вы столкнулись, заключается в следующем:

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
//end loop

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

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
[x release];
//end loop

или это:

//start loop    
MyItem *x = [[[MyItem alloc] init] autorelease];
[itemArray addObject:x];
//end loop

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

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

2 голосов
/ 31 июля 2011

Просто позвоните -removeAllObjects. Объекты, добавленные в NSArray, сохраняются массивом и освобождаются при их удалении.

Обратите внимание, что если вы создаете объект с +alloc, вы также должны выпустить его где-нибудь с совпадающими -release или -autorelease. Похоже, что у вас его нет, когда вы создаете свои объекты. Или:

MyItem *x = [[[MyItem alloc] init] autorelease];
[itemArray addObject:x];

или

MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
[x release];

будет работать.

1 голос
/ 31 июля 2011

Группа методов add в NSArrays сохраняет объекты, которые вы передаете, а группа методов удаления освобождает их, поэтому вы можете использовать второй метод.Фактически, ваш первый метод (отправка релиза каждому объекту с последующим вызовом removeAllObjects), скорее всего, приведет к возникновению исключения BAD_EXEC_ACCESS.

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