引用计数是什么
引自维基百科引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。使用引用计数技术可以实现自动资源管理的目的。同时引用计数还可以指使用引用计数技术回收未使用资源的垃圾回收算法。 当创建一个对象的实例并在堆上申请内存时,对象的引用计数就为1,在其他对象中需要持有这个对象时,就需要把该对象的引用计数加1,需要释放一个对象时,就将该对象的引用计数减1,直至对象的引用计数为0,对象的内存会被立刻释放。
正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1;
当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象;
当对象的引用计数为0时,表明程序已经不再需要该对象,系统就会回收该对象所占用的内存。
- 当程序调用方法名以
alloc
、new
、copy
、mutableCopy
开头的方法来创建对象时,该对象的引用计数加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框架中用于macOS
、iOS
应用开发。Cocoa
框架中Foundation
框架类库的NSObject
类担负内存管理的职责。Objective-C
内存管理中的alloc/retain/release/dealloc
方法分别指代NSObject
类的alloc
类方法、retain
实例方法、release
实例方法和dealloc
实例方法。
Cocoa框架、Foundation框架和NSObject类的关系: