关键字:引用计数
什么事引用计数,引用计数的原理是什么
引用计数是一个简单而有效的管理对象生命周期的方式。当我们创建一个新对象的时候,它的引用计数为1。当有一个新的指针指向对象的时候,我们将引用计数加1。当某个指针不再指向对象的时候,就将这个对象的引用计数减1 。注意,当对象的引用计数变为1后再进行release操作,引用计数将不会再减1,而是直接销毁对象,回收内存。引用计数的这种管理方式类似于文件系统里面的硬链接。在 Linux 文件系统中,我们用 ln 命令可以创建一个硬链接(相当于我们这里的retain) ,当删除一个文件时(相当于我们这里的 release),系统调用会检查文件的 link count 值,如果这个值大于1 ,则不会回收文件所占用的磁盘区域。直到最后一次删除前,系统发现 link count 值为 1 ,系统才会执行真正的删除操作,把文件所占用的磁盘区域标记成未使用。
循环引用问题
引用计数这种管理内存的方式虽然简单,但是也有一个比较大的瑕疵。就是它并不能很好的解决循环引用问题。当两个对象相互引用了对方作为自己的成员变量,只有当自己销毁时,才会将成员变量的引用计数减1,两个对象的销毁都依赖于对方,就会造成循环引用问题,即使外界已经没有任何指针指能够访问到他们了,它们也无法被释放
不止两个对象存在循环引用问题,多个对象相互引用只要构成了闭环,也会造成循环引用问题,而在实际编程中,环越大就越难被发现。
检查是否造成内存泄露在Xcode菜单栏选择"Product"->"Profile",然后选择"Leaks",再点击右下角的"Profile"按钮开始检测
使用ARC(Automatic Reference Count)
自动引用计数(简称ARC),是苹果WWDC2011年大会上提出的用于内存管理的技术。
ARC技术离现在已近很多年了,而且平果现在将MacOS上的垃圾回收机制(Deprecated),采用ARC代替。说明现在的ARC已近相当成熟了。使用ARC基本可以不用考虑内存泄露的问题。它可以让你从繁琐的内存管理代码中解脱出来,用更多的精力来思考业务逻辑、代码结构、设计模式。
ARC固然很好,但对于初学者来说,不思考内存,对于iOS很多问题就不能深入理解。ARC能够解决iOS大部分内存问题,但它也不是万能的,有些时候还是需要开发者自己来处理的,这主要是与底层的Core Foundation对象交互的那部分。Core Foundation对象不受ARC管理,所以需要自己维护这些对象的引用计数