引用计数

引用计数是什么

引自维基百科引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。使用引用计数技术可以实现自动资源管理的目的。同时引用计数还可以指使用引用计数技术回收未使用资源的垃圾回收算法。 当创建一个对象的实例并在堆上申请内存时,对象的引用计数就为1,在其他对象中需要持有这个对象时,就需要把该对象的引用计数加1,需要释放一个对象时,就将该对象的引用计数减1,直至对象的引用计数为0,对象的内存会被立刻释放。

正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1;
当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象;
当对象的引用计数为0时,表明程序已经不再需要该对象,系统就会回收该对象所占用的内存。

  • 当程序调用方法名以allocnewcopymutableCopy开头的方法来创建对象时,该对象的引用计数加1
  • 程序调用对象的retain方法时,该对象的引用计数加1
  • 程序调用对象的release方法时,该对象的引用计数减1

NSObject 中提供了有关引用计数的如下方法:

  • retain:将该对象的引用计数器加1
  • release:将该对象的引用计数器减1
  • autorelease:不改变该对象的引用计数器的值,只是将对象添加到自动释放池中。
  • retainCount:返回该对象的引用计数的值。

引用计数内存管理的思考方式

看到“引用计数”这个名称,我们便会不自觉地联想到“某处有某物多少多少”而将注意力放到计数上。但其实,更加客观、正确的思考方式:

  • 自己生成的对象,自己持有。
  • 非自己生成的对象,自己也能持有。
  • 不再需要自己持有的对象时释放。
  • 非自己持有的对象无法释放。

引用计数式内存管理的思考方式仅此而已。按照这个思路,完全不必考虑引用计数。 上文出现了“生成”、“持有”、“释放”三个词。而在Objective-C内存管理中还要加上“废弃”一词。各个词标书的Objective-C方法如下表。

对象操作 Objective-C方法
生成并持有对象 alloc/new/copy/mutableCopy等方法
持有对象 retain方法
释放对象 release方法
废弃对象 dealloc方法

这些有关Objective-C内存管理的方法,实际上不包括在该语言中,而是包含在Cocoa框架中用于macOSiOS应用开发。Cocoa框架中Foundation框架类库的NSObject类担负内存管理的职责。Objective-C内存管理中的alloc/retain/release/dealloc方法分别指代NSObject类的alloc类方法、retain实例方法、release实例方法和dealloc实例方法。

一图胜千言.png

Cocoa框架、Foundation框架和NSObject类的关系:


Cocoa框架、Foundation框架和NSObject类的关系 .png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。