Помощь в отладке приложения для iPhone – EXC_BAD_ACCESS

Я разработал свое приложение, используя свое устройство 3G для тестирования. Предоставив это другу для тестирования, он заметил, что он дает сбой. Я просмотрел журнал сбоев, но он не очень полезен, за исключением оператора «EXC_BAD_ACCESS» после нескольких предупреждений о памяти.

На моем устройстве я могу использовать лоты imagePicker, и каждый раз, когда делается фотография, я получаю предупреждение о памяти, но это не вызывает никаких проблем.

На устройстве моего друга (тоже 3G) после пары снимков, выбранных с камеры, приложение вылетает.

Итак, мой вопрос: я думаю, что-то освобождается из-за предупреждения о памяти, но только на устройстве моего друга, а затем после освобождения его пытаются использовать снова. Как я могу узнать, какой объект вызывается? Я не могу использовать NSZombies, потому что это удаленное (бета) устройство.

Помоги пожалуйста!

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

Спасибо!

РЕДАКТИРОВАТЬ: Новое открытие. Я также получаю это сообщение об ошибке: KERN_PROTECTION_FAILURE, которое, как я понимаю, связано с доступом к данным. Сбой, кажется, происходит сразу после того, как я сохраняю изображение, полученное из UIImagePicker. Любые идеи?


person mac_55    schedule 07.01.2010    source источник
comment
Вероятно, делегат выбора изображения. Возможно ли, что вы выпустили его? Ваш друг по-прежнему может отправлять журналы сбоев. Поищите в Google, как получить их с помощью iTunes и как символизировать.   -  person Rob Napier    schedule 08.01.2010
comment
Я не думаю, что выпустил его. Я всегда отклоняю средство выбора только в методе делегата didFinishPickingMediaWithInfo. Хотя, возможно, мне следует использовать возвращенную «информацию», прежде чем я отклоню сборщик? В настоящее время я сначала отклоняю средство выбора, а затем использую возвращенное изображение.   -  person mac_55    schedule 08.01.2010


Ответы (2)


Возможно, вы что-то перевыпускаете. Если вы используете Snow Leopard, запустите Static Analyzer (Cmd-Shift-A) и найдите ошибки памяти.

Тот факт, что он падает после ошибки памяти, предполагает, что UIViewController выпустил свое представление. Есть ли у вас какие-либо UIViewController, которые наблюдают за NSNotifications или иным образом могут изменить свои IBOutlets, пока они находятся за пределами экрана? Это частая причина такого рода сбоев. Убедитесь, что вы правильно управляете памятью IBOutlets. . UIViewControllers никогда не должны связываться со своими IBOutlets (или вообще с их компонентами пользовательского интерфейса), когда они находятся за пределами экрана. Даже если вы не совершите эту ошибку, если вы не реализуете вещи, как указано в приведенной выше ссылке, вы все равно можете выйти из строя после предупреждений о памяти.

MemoryWarning была довольно хорошей идеей, и ситуация улучшилась, но Apple до сих пор не решила все проблемы, связанные с тем, как она работает с UIViewController. Разработчик по-прежнему должен быть очень осторожным.

person Rob Napier    schedule 07.01.2010
comment
Привет. Я попробовал Static Analyzer, и никаких ошибок не появилось. На самом деле вообще ничего не произошло, кроме сообщения «Успешно» внизу окна. Очень странно. - person mac_55; 08.01.2010
comment
Не так уж и странно. Просто означает, что у вас нет явных ошибок. Неправильное управление IBOutlets не будет обнаружено с помощью clang, равно как и уведомления об выпущенных объектах. - person Rob Napier; 08.01.2010
comment
Из моего файла журнала я вижу следующее. Означает ли это, что проблема возникает на странице [PictureView clearPage]? Тип исключения: EXC_BAD_ACCESS (SIGBUS) Коды исключений: KERN_PROTECTION_FAILURE на 0x0000000f Сбой потока: 0 Thread 0 Сбой: 0 libobjc.A.dylib 0x00003ebc objc_msgSend + 20 1 MyApp 0x0000378a -[PictureView clearPage] (PictureView.m:7) - person mac_55; 08.01.2010
comment
Конечно; посмотрите на строку 79 в PictureView.m и посмотрите, какой указатель разыменовывается. Это будет тот, кому вы отправляете сообщение (поскольку он не работает в objc_msgSend). - person Rob Napier; 09.01.2010

Ваш друг должен подойти к вашему компьютеру и запустить его с помощью NSZombieEnabled. Это лучший способ отладить эти проблемы.

person Mike    schedule 07.01.2010
comment
Да, это то, что я хотел бы сделать, но это практически невозможно. Нет ли способа записать что-нибудь подобное? - person mac_55; 08.01.2010