EXC_BAD_ACCESS использует ARC и не может отслеживать на симуляторе
Я создавал приложение для клиента, и все шло гладко, пока я не начал получать эту ошибку. Это уникальная ситуация, я научился пользоваться инструментами и NSZombie, однако я не могу запускать инструменты с NSZombieEnabled на iPhone только на симуляторе. Я должен отладить эту проблему в iPhone, потому что я использую UIImagePicker, чтобы сделать снимок, и ошибка происходит вскоре после того, как я делаю снимок. Я также использую ARC, поэтому я вообще не могу устанавливать релиз или сохранять информацию, ARC запрещает это, поэтому я сомневаюсь, что это двойной релиз или что-то в этом роде. Есть 2 возможных ответа на этот вопрос.
1: Кто-нибудь знает, могу ли я передать изображение в UIImagePicker с помощью фотобудки? Я мог бы использовать инструменты и NSZombie, если бы я мог пройти мимо экрана камеры.
2: есть ли способ определить, какая строка будет причиной ошибки, без рефакторинга или комментирования кода с помощью iPhone? Кто-нибудь знает эффективный способ отследить bad_acces на iPhone?
Имейте в виду, я использую ARC и не могу отладить это на симуляторе. Если я удалю сценарий управления UIImagePicker, ошибка не произойдет, поэтому я сузил ее до чего-то в своем классе CameraViewController. Боюсь, я не могу опубликовать какой-либо код из-за ранее существовавшего контракта, вы должны быть сотрудником, чтобы просмотреть исходный код.
Извините за ограниченную информацию, но на самом деле я ищу ответ об отладке, а не о прямом решении моей проблемы с точным кодом.
Собираюсь опубликовать обратную трассировку (я думаю)
(gdb) bt
#0 0x339737e4 in objc_msgSend ()
#1 0x31b30140 in -[UIApplication sendAction:to:from:forEvent:] ()
#2 0x31b300e0 in -[UIApplication sendAction:toTarget:fromSender:forEvent:] ()
#3 0x31b300b2 in -[UIControl sendAction:to:forEvent:] ()
#4 0x31b2fe04 in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
#5 0x31b30452 in -[UIControl touchesEnded:withEvent:] ()
#6 0x31b2eddc in -[UIWindow _sendTouchesForEvent:] ()
#7 0x31b2e756 in -[UIWindow sendEvent:] ()
#8 0x31b299fe in -[UIApplication sendEvent:] ()
#9 0x31b29336 in _UIApplicationHandleEvent ()
#10 0x3026c04a in PurpleEventCallback ()
#11 0x3443fce2 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#12 0x3443fca6 in __CFRunLoopDoSource1 ()
#13 0x3443256c in __CFRunLoopRun ()
#14 0x34432276 in CFRunLoopRunSpecific ()
#15 0x3443217e in CFRunLoopRunInMode ()
#16 0x3026b5f2 in GSEventRunModal ()
#17 0x3026b69e in GSEventRun ()
#18 0x31ad0122 in -[UIApplication _run] ()
#19 0x31ace12e in UIApplicationMain ()
#20 0x000034ce in main (argc=1, argv=0x2ffff75c) at /Users/Andrew/Documents/Developing/Xcode Projects/ProjectSVN/Project/trunk/ProjectInterface/ProjectInterface/main.m:16
2 ответа
Без примеров кода трудно сказать, однако ARC не полностью охватывает все ваши базы. Например, можно получить эти ошибки EXC_BAD_ACCESS, когда объекты (классы с делегатами) не существуют, но пытаются выполнить методы делегата обратного вызова.
Чтобы быть более конкретным, скажем, я создал класс в viewDidLoad:
- давайте назовем это ClassA
, В моей гипотетической ситуации я установил свой контроллер вида на ClassA
делегат. Тем не менее, я не объявил недвижимость для ClassA
поэтому нет ссылки на него за рамками viewDidLoad:
,
Теперь давайте предположим, ClassA
объявить метод делегата, который реализован моим контроллером представления. Этот делегат передает ссылку на себя обратно в контроллер представления в этом методе делегата. Поскольку это может или не может быть вне области этой точки, БУМ, ошибка неверного доступа. Проверьте на такие вещи, где объекты больше не существуют и передаются другим методам - это один из способов, которым ARC может вас подвести;)
EXC_BAD_ACCESS
не обязательно означает проблему управления памятью. Это также легко может быть вызвано повреждением памяти или другими видами ошибок.
Опубликовать обратный след аварии.