悬挂指针问题
当你运行MemoryProblems后,点击悬挂指针那个选项,就会出现EXC_BAD_ACCESS崩溃信息。
一般来说,出现EXC_BAD_ACCESS错误的原因都是悬挂指针导致的,但具体是哪个指针是悬挂指针还不确定,因为控制台并没有给出具体crash信息。
启用NSZombieEnabled
要想得到更多的crash信息,你需要启动NSZombieEnabled。具体步骤如下:
1.选中Edit Scheme,并点击
设置完之后,再次运行和点击悬挂指针,虽然会再次crash,但这次控制台打印了以下有用信息:
内存泄露问题
静态分析
一般来说,在程序未运行之前我们可以先通过Clang Static Analyzer(静态分析)来检查代码是否存在bug。比如,内存泄露、文件资源泄露或访问空指针的数据等。下面有个静态分析的例子来讲述如何启用静态分析以及静态分析能够查找哪些bugs。
启动程序后,点击静态分析,马上就出现crash
此时,即使启用NSZombieEnabled,控制台也不能打印出更多有关bug的信息,具体原因是什么,等下会解释。
-
手动静态分析:每次都是通过点击菜单栏的Product -> Analyze或快捷键shift + command + b
-
自动静态分析:在Build Settings启用Analyze During 'Build',每次编译时都会自动静态分析
启动Instruments
有时使用静态分析能够检查出一些内存泄露问题,但是有时只有运行时使用Instruments才能检查到,启动Instruments步骤如下:
1.点击Xcode的菜单栏的 Product -> Profile 启动Instruments
3.打开Leaks工具之后,点击红色圆点按钮启动Leaks工具,在Leaks工具启动同时,模拟器或真机也跟着启动
4.启动Leaks工具后,它会在程序运行时记录内存分配信息和检查是否发生内存泄露。
如果发生内存泄露,我们怎么定位哪里发生和为什么会发生内存泄露?
定位内存泄露
借助Leaks能很快定位内存泄露问题,步骤如下:
-
首先点击Leak Checks时间条那个红色叉
-
然后双击某行内存泄露调用栈,会直接跳到内存泄露代码位置
难以检测Block引用循环
总结
一般来说,在创建工程的时候,我都会在Build Settings启用Analyze During 'Build',每次编译时都会自动静态分析。这样的话,写完一小段代码之后,就马上知道是否存在内存泄露或其他bug问题,并且可以修bugs。而在运行过程中,如果出现EXC_BAD_ACCESS,启用NSZombieEnabled,看出现异常后,控制台能否打印出更多的提示信息。如果想在运行时查看是否存在内存泄露,使用Instrument Leak工具。但是有些内存泄露是很难检查出来,有时只有通过手动覆盖dealloc方法,看它最终有没有调用。
-