EXC_BAD_ACCESS для NSMutableArray - PullRequest
       11

EXC_BAD_ACCESS для NSMutableArray

0 голосов
/ 04 февраля 2011

У меня есть NSMutableArray с несколькими элементами просмотра.

Я удаляю представление из иерархии представлений и затем проверяю счетчик сохранения массива, он возвращает 1. Затем я отправляю [array release], но код сбрасывается с EXC_BAD_ACCESS.

Я вижу, что в массиве есть элементы, но все еще дампы кода.

Вот что я нашел во время отладки. В массиве присутствуют все 100 объектов (количество в массиве возвращает 100), а содержимое при просмотре в отладчике возвращает «Out of Scope» для элементов. Кроме того, поскольку массив находится в иерархии представлений, следующий код уменьшает количество сохраняемых данных в два раза:

for (Liv *view1 in viewArray){
    NSLog(@"view count = %d", [view1 retainCount]);
    [view1 removeFromSuperview];

    NSLog(@"view count = %d", [view1 retainCount]); 
}

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Не используйте retainCount

Это бесполезно для такого рода отладки;вы работаете с представлениями в иерархии представлений фреймворка.Может быть любое количество причин, по которым количество сохраняемых данных увеличивается или уменьшается на 2, 10 или 42.

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

Сначала используйте «build and analysis», чтобы статический анализатор llvm проверил ваш код.Исправьте все обнаруженные проблемы.

Далее, как распределяется массив?Где вы храните это?Разместите все строки кода, которые объявляют или манипулируют массивом.

Наконец, как сказал Пол, включите зомби и посмотрите, что произойдет.

Есть вероятность, что это не такпроблема сохранения / выпуска, но пока нет никаких доказательств, указывающих на это.

0 голосов
/ 04 февраля 2011

Вы retain или alloc массив?Если нет, вы не должны отправлять его release.

EXC_BAD_ACCESS означает, что вы отправляете сообщение объекту, который уже был освобожден.Вы (или какой-то код где-то) выпускаете его до той части кода, куда вы отправляете release (или removeAllObjects).

Обычно, если ваши удержания и выпуски сбалансированы, вы выигралине понимаю эту ошибку.Нам нужно увидеть некоторый код, прежде чем мы сможем предложить что-то большее, чем общий совет.

Использование NSLog() и retainCount не самый простой способ отладки ошибок такого рода.Предполагая, что вы работаете в Xcode 3.2.6, попробуйте запустить код через «Выполнить»> «Выполнить с помощью Performance Tool»> «Зомби».Это должно дать вам хороший указатель на то, какая часть вашего кода неисправна.

...