我的想法已经不多了.我在使用ARC的项目上收到EXC_BAD_ACCESS.根据调试器,它在main()中. NSZombieEnabled设置为YES但我没有看到任何callstack或Class / Type或任何东西.检查器/配置文件也是如此.在应用程序崩溃后的某个时间,我得到的只是“会话超时”.
而且很难在我的代码中找到它.
我正在设置像
NSLog(@"CrashLog: <%@:%@:%d:%s>",NSStringFromClass([self class]),NSStringFromSelector(_cmd),__LINE__,__FILE__);
关于enty和退出方法的代码,但我还没有找到任何有用的模式.我所能看到的是,当抛出EXC_BAD_ACCESS时,我所有的方法都已经存在.
有关如何隔离问题的任何想法?
Tim建议在gdb中使用back trace(bt).结果是:
#0 0x0be87580 in TI::Favonius::BeamSearch::choose_hit_test_node () #1 0x0be87b5f in TI::Favonius::BeamSearch::update_for_touch () #2 0x0be8ee32 in TI::Favonius::StrokeBuildManager::update_search_for_touch () #3 0x0be8f58f in TI::Favonius::StrokeBuildManager::key_down_or_drag_hit_test_for_UI () #4 0x0be6ba8b in TIInputManagerZephyr::simulate_touches_for_input_string () #5 0x0be7e5d9 in -[TIKeyboardInputManagerZephyr candidates] () #6 0x00678345 in -[UIKeyboardImpl generateAutocorrectionReplacements:] () #7 0x007dcaec in __71-[UITextInteractionAssistant scheduleReplacementsForRange:withOptions:]_block_invoke_0 () #8 0x007f6db2 in -[UITextSelectionView calculateAndShowReplacements:] () #9 0x00e255fd in __NSFireDelayedPerform () #10 0x01a03976 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ () #11 0x01a03417 in __CFRunLoopDoTimer () #12 0x019667e0 in __CFRunLoopRun () #13 0x01965dd4 in CFRunLoopRunSpecific () #14 0x01965ceb in CFRunLoopRunInMode () #15 0x01ccb879 in GSEventRunModal () #16 0x01ccb93e in GSEventRun () #17 0x0050d38b in UIApplicationMain () #18 0x000033e0 in main (argc=1,argv=0xbffff5fc) at /Users/Hermann/AppDev/fcApp/fcApp/main.m:16
解决方法
仍然有办法通过ARC获得EXC_BAD_ACCESS.我碰到的一些
>如果你正在做一个你制作一个对象并且异步调用你的东西 – 你必须确保在某处保留对它的引用,否则ARC将释放它.一个例子是UIImagePicker – 您不能只创建一个本地图像选择器变量并调用它(然后在它回调时释放它) – 你必须创建一个属性并保持它
>如果你不总是使用属性来保持它,你可能会遇到麻烦 – ARC使用强弱的存在来知道该怎么做 – 如果你使用ivar代替,你可能会欺骗ARC(不是100%肯定这一点).确保不执行此操作的一种简单方法是使用@synthesize var = _var而不是让属性和ivar具有相同的名称.这样,如果你忘记了self.var = obj并且只使用var = obj就会抱怨.
>我在手势和标签中遇到了一个错误 – 标签视图没有保留IB添加的手势 – 我在这里记录了它
Crash when using gesture recognizers in StoryBoard
在这些情况下,僵尸应该提供帮助 – 所以它没有帮助意味着你可能不会过早地导致释放发生.更有可能是你正在调整内存 – 我会检查所有强制转换以及你使用内置数组或非对象指针的任何地方,以确保你不会超出界限. Guard Malloc可以提供帮助