IOS 崩溃原因统计 2014-07-12 10:13

时间:2020-12-06 16:07:54
注意:
1,释放自己的autorelease对象,app会crash;
2,释放系统的autorelease对象,app会crash;
 
第一种 情况有现象如下:
声明一个 对象 A* obj;把obj 存在 NSMutubleArray 中。如果obj 是自动释放类型的,在未手动release 前 po NSMutubleArray 对象数据是: <__NSArrayM 0x167cd320>(

<A: 0x161c1c20>,

<A: 0x167d0550>,

<A: 0x1ed68f50>

)

如果此时你手动release后。GDB状态下po NSMutubleArray 数组对象会 提示 *** -[AdebugDescription]: message sent to deallocated instance 0x1ed68f50

[no Objective-C description available] 最后一个释放掉啦。通过对象查看器发现

<A: 0x161c1c20>,

<A: 0x167d0550>,

<_NSZombie_A: 0x1ed68f50> ,发现最后一个已经变为无效数据了。

如果再发现_NSZombie_* 这样的数据,基本上都是手动释放了autorelease 对象数据导致。

 

第二种情况现象如下:

比如:

UIButton *mapButton = [UIButton buttonWithType:UIButtonTypeCustom]; 这样一个button 对象。在未手动release 之前po 对象得出数据入下:

<UIButton: 0x19c68020; frame = (251 20; 50 50); opaque = NO; tag = 2; layer = <CALayer: 0x19c68870>>

等崩溃发生后后台会打印如下数据:

 

-[CALayer release]: message sent to deallocated instance 0x19c68870

如果在发生 CALayer release 时一定是系统自动释放对象,被我们手动释放掉了。

 

以上信息是崩溃后得出的结论,当出现以上情况是重新仔细的阅读代码。肯定可以发现问题所在。