标签:
EXC_BAD_ACCESS, objc_msgSend,
此类报错往往来的莫明奇妙.
原因往往是内存过度释放导致, 即多写了release;
至于是哪里多写了release, 很难查知, 以下及为查询方法.
#ifdef _FOR_DEBUG_
- (BOOL)respondsToSelector:(SEL)rtSelector
{
NSString *className = NSStringFromClass([self class]) ;
NSLog(@"%@ --> RTSelector: %s",className,[NSStringFromSelector(rtSelector)UTF8String]);
return [super respondsToSelector:rtSelector];
}
#endif
三:找到模糊的地方, 断点调试, 或者打印标识 从大范围到小范围,
具体操作我这里就不多说了,根据项目的需求在对应代码行的左边点击就可以打断点
四:Leak的方式
打开Instruments工具:
Xcode -> Open Developer Tool -> Instruments,
选择Zombies类型.
重新启动运行Project, 先不要执行到崩溃点.
在打开的Instruments工具中choose要检查的程序名称;
然后点击Instruments左上角的record按钮, 开始记录内存使用情况.
继续执行程序至崩溃点.
程序执行到第40秒报出zombie Messaged错误;
点击图中圈选的">"查看内存详情.
分析内存调用详情:
排除操作系统retain, release的部分,
可知是由于CameraLiveViewController执行dealloc,
对内存0x180d5420多调用了release.
综合以上结果:
可知是存在于CameraLiveViewController中的一个UILabel多执行了release.
此时可添加代码对CameraLiveViewController中的可疑UILabel打印日志.
重新执行上述过程, 对比打印UILabel与Zobmie内存的地址,
从而定位出错位置.
iOS开发——调试技巧OC篇&EXC_BAD_ACCESS无处不在
标签:
原文地址:http://www.cnblogs.com/iCocos/p/4803928.html