Устранение неполадок загадочного EXC_BAD_ACCESS в приложении IOS

Когда я запускаю свое приложение IOS (либо на симуляторе IPad, либо на реальном устройстве), я получаю ошибку EXC_BAD_ACCESS. Обычно у меня не было бы проблем с устранением неполадок, но ошибка возникает глубоко внутри самой системы, и после поиска я застрял, как продолжить устранение неполадок.

Может ли кто-нибудь дать мне несколько идей, что происходит или как это исправить? Я работаю над огромным проектом и без каких-либо указаний в сообщении об ошибке не знаю, с чего начать.

Спасибо!

#0  0x0230609b in objc_msgSend ()
#1  0x0206943d in CFRetain ()
#2  0x0214e9c0 in +[__NSArrayI __new::] ()
#3  0x020a200a in -[__NSPlaceholderArray initWithObjects:count:] ()
#4  0x009aa2dc in -[CALayerArray copyWithZone:] ()
#5  0x02164bd9 in -[NSObject copy] ()
#6  0x016bb0fa in -[UIView dealloc] ()
#7  0x02306e4d in _objc_rootRelease ()
#8  0x0206e435 in CFRelease ()
#9  0x0214fe94 in -[__NSArrayM dealloc] ()
#10 0x02306e4d in _objc_rootRelease ()
#11 0x02306e10 in objc_release ()
#12 0x02307c60 in (anonymous namespace)::AutoreleasePoolPage::pop(void*) ()
#13 0x02096ed8 in _CFAutoreleasePoolPop ()
#14 0x012619f9 in -[NSAutoreleasePool release] ()
#15 0x0168af78 in _UIApplicationHandleEvent ()
#16 0x035dffa9 in PurpleEventCallback ()
#17 0x021361c5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#18 0x0209b022 in __CFRunLoopDoSource1 ()
#19 0x0209990a in __CFRunLoopRun ()
#20 0x02098db4 in CFRunLoopRunSpecific ()
#21 0x02098ccb in CFRunLoopRunInMode ()
#22 0x016872a7 in -[UIApplication _run] ()
#23 0x01688a9b in UIApplicationMain ()
#24 0x0020f2a4 in main at /..../main.m:17

person Locksleyu    schedule 03.11.2011    source источник
comment
Это не поможет вам напрямую отследить проблему, это очень помогло мне понять, что WTF продолжал с этими ошибками: loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html   -  person Tim    schedule 03.11.2011
comment
NSZombieEnabled (рекомендуется по ссылке в этой ссылке) также является хорошим местом для начала.   -  person jrturton    schedule 03.11.2011


Ответы (2)


Я сначала предполагаю, что вы выпускаете представление, которое уже выпущено автоматически. Например:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[self.view addSubview:myButton]
[myButton release];

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

Если возможно, вы можете подумать о переносе проекта в ARC, поскольку он решает большинство (но не все!) Этих проблем. В противном случае, лучше всего для отладки, вероятно, будет #ifdef out части вашего кода до тех пор, пока сбой не исчезнет, ​​а затем вставить код обратно до тех пор, пока он снова не выйдет из строя.

person EricS    schedule 03.11.2011
comment
Спасибо за предложения. В итоге я закомментировал последовательные части кода и обнаружил, что освобождаю объект дважды (: - person Locksleyu; 10.11.2011

Из трассировки стека вы можете определить следующее:

1) Это связано с пулом автозапуска

2) Освобождается массив

3) Я предполагаю, что этот массив содержит некоторые UIViews (возможно)

4) В рамках Dealloc UIView что-то идет ужасно не так

Это не так уж и полезно, извините :)

Автозапуск в начале трассировки стека говорит вам, что это почти наверняка то, чего вы не сохранили в достаточной степени :)

Есть ли какое-то конкретное представление, в котором возникает эта ошибка?

person deanWombourne    schedule 03.11.2011