从App随机崩溃(KVO_IS_RETAINING_ALL_OBSERVERS...)到彻底修复的回顾(上)

本博通过具体的实例向大家展示如何一步步通过合(xia)理(cai)分析找出问题的罪魁祸首,适合有一定调试经验的童鞋,也欢迎各路神仙和小白围观,本人水平一般,欢迎指正,但我就是不改.

崩溃特征

0.崩溃的类型是EXC_BAD_ACCESS

1.App崩溃虽说是随机的,但在一定次数的相同UI操作后必定会发生,但操作的次数不固定。

2.从Xcode里观察崩溃时的源代码,"按道理"完全不可能崩溃

3.而且特别有意思的地方是:当你在Xcode中开启了"僵尸对象"后,崩溃现象神奇的消失了

4.每次崩溃的堆栈痕迹(以下简称栈迹,觉得别扭么?习惯就好)都不一样,但翻来覆去就是那几种

5.有一次崩溃后栈迹里完全看不到函数符号名称,只有一些地址,这说明堆栈记录破坏的很厉害。还有一次更离谱:崩溃App直接从真机里退出了,留下一脸懵逼的Xcode傻傻的在那里完全没有反应…

用栗子说话

有点兴趣了么?下面是其中一个崩溃时的栈迹(是的,我也记不得调试了多少次…):

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x5c89a7ce0)
    frame #0: 0x00000001c223fdac libobjc.A.dylib`object_isClass + 16
    frame #1: 0x00000001c3ae6898 Foundation`KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED + 68
    frame #2: 0x00000001c3ae402c Foundation`NSKeyValueWillChangeWithPerThr

你可能感兴趣的:(iOS开发之旅)