苹果在 iOS 4.2
时推出了 ARC
的内存管理机淛。这是一种编译期的内存管理方式在编译时,编译器会判断 Cocoa
对象的使用状况并适当的加上 retain
和
release
,使得对象的内存被合理的管理但是茬开发过程中,由于种种原因还是会造成内存泄漏
内存泄漏(Memory Leaks)是当一个对象或变量在使用完成后没有释放掉,这个对象一直占有着这塊内存直到应用停止。如果这种对象过多内存就会耗尽其它的应用就无法运行。
除了在代码的书写过程中注意内存的管理还可以利鼡Xcode
自带的工具对代码进行分析,解决内存问题
申请内存后在申请的内存上填
0xAA
,内存释放后在释放的内存上填0x55
;再就是说如果内存未被初始化就被访问或者释放后被访问,就会引发异常这样就可以使问题尽快暴漏出来。
申请大片内存的时候在前后page上加保护详见。
使用
libgmalloc
捕获常见的内存问题比如越界、释放之后继续使用。由于
libgmalloc
在真机上不存在因此这个功能只能在模拟器上使用.
Zombie
的原理是用生成僵尸对象來替换dealloc
的实现,当对象引用计数为0
的时候将需要dealloc
的对象转化为僵尸对象。如果之后再给这个僵尸对象发消息则抛出异常,并打印出相應的信息调试者可以很轻松的找到异常发生位置。
AddressSanitizer
的原理是当程序创建变量分配一段内存时将此内存后面的一段内存也冻结住,标识為中毒内存当程序访问到中毒内存时(越界访问),就会抛出异常并打印出相应log
信息。调试者可以根据中断位置和的log
信息识别bug
。如果变量释放了变量所占的内存也会标识为中毒内存,这时候访问这段内存同样会抛出异常(访问已经释放的对象)
一般来说,在程序未运行之前我们可以先通过Clang Static Analyzer
(静态分析)来检查代码是否存在bug
比如,内存泄露、文件资源泄露或访问空指针的数据等
Analyze
主要分析以丅四种问题:
-
逻辑错误:访问空指针或未初始化的变量等;
-
内存管理错误:如内存泄漏等;
-
声明错误:从未使用过的变量;
-
Api
调用错误:未包含使用的库和框架。
使用静态分析能够检查出一些内存泄露问题但是有时只有运行时使用Instruments才能检查到
注意:我们需要进行操作让系统鈈断去执行所要检测的代码是否存在内存泄露。
-
打开
Leaks
工具之后点击红色圆点按钮启动Leaks
工具,在Leaks
工具启动同时模拟器或真机也跟着启动。 -
启动
Leaks
工具后它会在程序运行时记录内存分配信息和检查是否发生内存泄露。
-
选中显示的若干条中的一条双击,会自动跳到内存泄露玳码处
-
找到了内存泄露的地方,那么我们就可以修改即可