首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。你需要在每个object(或者用Method Swizzling自己搜方法,可以不用每个object都写)的.m或者.mm文件中加入上面代码,并且在 other c flags中加入-D FOR_DEBUG(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。
#ifdef _FOR_DEBUG_
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
#endif
1.重写object的respondsToSelector方法,现实出现EXEC_BAD_ACCESS前访问的最后一个object。
2.打开“僵尸模式”能迅速定位。有时候只会打印这样一句:
message sent to deallocated instance 0x7ff8fdd2f9c0
//0x7ff8fdd2f9c0就是这个对象
此时可以在终端输入以下命令来查找
输入:sudo malloc_history 1527 0x7ff8fdd2f9c0
3.设置全局断点快速定位问题代码所在行。
4.Xcode 7 已经集成了BAD_ACCESS捕获功能:Address Sanitizer。 用法如下:在配置中勾选✅Enable Address Sanitizer。
5.通过instruments的Zombies。具体查看https://www.jianshu.com/p/51188549ff06。