Выпуск NSArray аварийно завершается с EXC_BAD_ACCESS - PullRequest
1 голос
/ 29 августа 2010

Еще одна загадка. У меня есть NSArray (iTours), содержащий 3 объекта и счет сохранения 1.

Этот массив высвобождается в методе objectloc следующим образом:

- (void)dealloc {
    NSLog(@"retain count für iTouren: %d", [iTours retainCount]);
    [iTours release];  // triggers EXC_BAD_ACCESS 
    [super  dealloc];
}

В окне консоли отображается следующее сообщение (без дополнительных сведений):

Программа получила сигнал: «EXC_BAD_ACCESS».

есть какие-нибудь подсказки, что происходит? Что я пропустил?

Ответы [ 6 ]

18 голосов
/ 29 августа 2010

Скорее всего, вы перевыпускаете iTouren и, таким образом, этот вызов release вызывает сбой.То есть iTouren уже освобожден к моменту, когда вы освобождаете содержащий массив, и когда этот содержащий массив отправляет release на уже освобожденный iTouren ваше приложение вылетает.

(Конечно, iToursэто может быть объект, который уже освобожден. В любом случае это проблема чрезмерного выпуска.)

Включите обнаружение зомби и посмотрите, не устраняет ли это конкретную проблему.

Обратите внимание, что

число, возвращаемое retainCount, бесполезно

.Абсолютные счетчики хранения являются деталями реализации и часто будут определенным значением, которое выглядит как бессмыслица.

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

4 голосов
/ 30 августа 2010

Никогда, никогда, никогда не полагайтесь на метод retainCount.

Всегда.

Я упоминал когда-либо?

0 голосов
/ 31 августа 2010

Освобожденный и освобожденный объект будет иметь счет сохранения 1. Неосвобожденный объект, который должен быть освобожден и освобожден, также будет иметь счет сохранения 1. (Предполагая, что память когда-либо выделяется для объекта, некоторые строки и числаникогда не распределяются, детали реализации, которые меняются в каждой версии Mac OS X)

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

Это ошибка и подход DIAF, который помогает сделать Mac OS X такой надежной.

0 голосов
/ 29 августа 2010

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

0 голосов
/ 29 августа 2010

Предполагая, что iTours и iTouren - это разные объекты (а именно, что iTours - это NSArray, содержащий iTouren), вы перевыпустили iTours;возможно, у вас произошел сбой в установщике, и iTours был выпущен без переназначения и сохранения.

0 голосов
/ 29 августа 2010

Один iTours другой iTouren.Вы регистрируете объект, отличный от того, который был освобожден.

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