Как полностью освободить изменяемый массив, а затем снова выделить - PullRequest
1 голос
/ 15 сентября 2009

У меня есть табличное представление, указатель изменяемого массива itemList содержит объекты для его ячеек. Я выделяю и инициализирую изменяемый массив,

itemList = [[NSMutableArray alloc] init];

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

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

if (self.itemList! = Nil) { [self.itemList removeAllObjects]; [выпуск self.itemList];

}

self.itemList = [[NSMutableArray alloc] init];

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

Я звоню [tableview reloadData];

Таблица загружается правильно, но после этого три или четыре раза происходит сбой моего приложения

Теперь, 1. когда я проверяю счетчик сохраняемых данных после вызова alloc, он показывает 2 года? 2. Через некоторое время мое приложение вылетает с ошибкой «Программа iphone получила сигнал:« 0 ». Предупреждение: check_safe_call: не удалось восстановить текущий кадр»

Я подозреваю, что itemList не был должным образом освобожден.

Может ли кто-нибудь направить меня, пожалуйста?

1 Ответ

5 голосов
/ 15 сентября 2009

Хорошо, много вещей здесь:

1) self.itemList = Так как у вас есть это, я предполагаю, что вы используете свойства. если ваш @property установлен как retain, вызов self.itemList = xxx сильно отличается от itemList = xxx. Видите ли, когда вы используете назначение self.itemList, все, что у вас уже было в itemList, автоматически освобождается для вас, а новое сохраняется. Итак, с этой строкой:

self.itemList = [[NSMutableArray alloc] init];

вы фактически удерживаете дважды, в то время как с этой строкой:

itemList = [[NSMutableArray alloc] init];

вы удерживаете только один раз. Использование свойств - это действительно простой и удобный способ управления записью, но все, что вам нужно в этом случае:

self.itemList = [NSMutableArray array]; //returns an autoreleased array that is then retained by the self.

Тогда вам нужно всего лишь один вызов release в вашем методе dealloc для очистки

[itemList release];

2) Когда элемент добавляется в массив, он сохраняется в массиве, поэтому вы можете освободить его сразу после слова

Foo *f = [[Foo alloc] init];
[itemList addObject:f];
[f release];

Когда массив освобождается, он отправляет сообщение о выпуске всем своим компонентам, поэтому вам не нужно беспокоиться о них с этого момента.

3) Я не уверен в вашем сбое, но попробуйте использовать отладчик, чтобы пройти и найти, где он падает. Похоже, это не связано с управлением памятью, которое у вас есть. Вы можете искать на этом сайте множество вопросов об отладке и поиске источника ошибок памяти, включая мой любимый NSZombieEnabled

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