为什么要进行内存管理?
因为移动设备的内存是有限的,每个app所占的内存也是有限的,当app占用内存较多的时候,系统就会发出内存警告
检测内存问题的一般方法
奔溃日志:EXC_BAD_INSTRUCTION
基本上表示野指针,就是对象释放了还在使用
可以使用僵尸断点查看是哪个内存地址被释放了(product->scheme>edit scheme> run>diagnostics 下选择 zombie object),然后对比调试台的对象的地址,就能知道是哪个对象被释放了还在使用
assign 对应的是 __unsafe_unretained 不持有对象,当对象的引用技术为0的时候,变量不设置为nil,而是继续保持对象的地址
assign 和 weak 都是弱引用,那么区别在哪儿?
weak修饰的变量对象释放后自动清空,赋值为nil
assign修饰的变量对象释放后不会自动清空,所以很容易造成野指针错误
内存泄漏的一般检测方法:
- 静态检测方法
- 手动:在build settings里设置 analyze during build 设置为yes,每次编译都会静态分析
- 自动:product > analyze
静态分析检查不出来循环引用
- 动态检测方法 instrument
选择instrument的leaks,边操作手机边查看内存泄漏的问题,有些时候能检测到内存泄漏,但是定位不到具体位置 - dealloc
析构方法打印看有没有跑dealloc
当某个对象当引用计数为0的时候,它会自动调用 dealloc方法,所以看它dealloc走没走就知道这个对象有没有被释放 - 第三方检测库
比如 MLeaksFinder:原理http://wereadteam.github.io/2016/02/22/MLeaksFinder/
网友评论