您的位置:首页 > 移动开发 > IOS开发

iOS MRC手动内存管理 心得体会

2015-11-29 09:02 211 查看
当你看到这篇文章的时候,你一定会觉得现在都ARC了,为何还花时间学MRC,首先要吐槽的的确是这件事

作为自己新的项目,的确没有必要再学ARC,但是对于维护别人的项目,这点就有点必要了,而且对于了解iOS的内存管理也有很大帮助

虽然我们现在都使用ARC,但是对于编译器而言依然是引用计数的MRC

iOS MRC手动内存管理 以下是自己调试出的经验

首先注意一点:
修改代码后clean工程是必须的,但还不够,还必须卸载手机上的app,否则会导致多次调用结果和预期不一致,本人就遇到了这怪事,调试了很久才得出这个结论,应该是Xcode的bug
最好以clean后第一次运行的结果为参考,有时候会有表现不一致的情况

进入正题:
iOS的内存管理是用引用计数的概念,当一块内存的引用计数为0时,才能被系统回收复用
这里有一个很重要的概念,属性,临时变量和内存
我们真正要关心的是内存,属性和临时变量的引用计数为0,并不代表内存会被释放回收,只有真正指向的内存计数为0,才能被回收;

所以就有了release和nil的区别

release和nil的区别:

release是将对象或者临时变量指向的内存引用计数-1,当为0的时候,可以真正释放内存,对象不能再继续使用,release能改同时变属性和临时变量的引用计数, strong和retain基本上表现一致

而nil是讲对象或者临时变量本身的引用计数-1,当计数为0时,内存并不会回收,而且对象还能继续调用,所以 = nil是个风险,当内存释放后还能继续调用,但所有属性都会被置为默认值

数组的情况:

数组内的对象会随着数组release而release
但是数组无论release多少次计数都不会为0,最后计数会变成一个无效数值,此时不能再继续调用它的方法
alloc和自动释放池的对象表现差不多
自动释放池的对象无论release多少次,都不会为0,直到pool drain,
当计数变为一个无效数值时不能继续调用它的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: