也谈引用计数

引用计数作为一种重要的GC(Garbage Collection)算法早已有之,不过也许在iOS流行后,作为Objc的重要元素,它才广为人知。当年学Objc时,碰到的最大难点也就是引用计数。manager把Objc入门教材给我时,嘱我须细看内存管理一章,深然其说。从一片茫然到知其用法,直到向安居客一位大牛请教了几次后,才发现人家是理解引用计数的思想的,而我之前只是知道它的用法。

在上海时,我们几个合租一套房的朋友就热水器的使用问题协商,协商的结果是——洗完澡后,如果夜已深,就把热水器关掉。当时我天天写Objc代码,于是想出的馊主意是——如果准备洗澡,就把自己的卡片贴在热水器旁,洗完了就把卡片取下——卡片的retainCount为0时,把热水器关掉。

在这个例子中,热水器是一块内存空间,而我们每个人是一个指针;某人准备洗澡时,即该指针指向热水器;贴上卡片,即引用计数+1。当卡片数为0时,关掉热水器,即释放内存空间。

这个例子并不算好,因为一块已申请的内存空间是可以“同时”被多个指针使用的,不存在先后次序关系(洗澡则需要排队)。

考虑一个自习教室,只有一盏灯,为自习教室中的所有同学所共享。同学们学习很认真,认真得并不知道,不关心这间教室还有多少同学——他们都觉得这盏灯是被自己使用的。但事实上这盏灯的明暗变化影响着所有的同学。

也许这个例子更切合实际一些。NSObject作为所有Objc类的基类,有一个方法,retainCount,用来读取该指针所指向的内存空间的引用计数。在实际编程中,不应该把retainCount作为逻辑判断的条件——因为每位同学并不关心这间教室还有多少同学,灯依然被正常使用。这也是我初学Objc时犯过的错误,后被大牛纠正。retainCount是用来debug的。

即便MS正确地使用引用计数,该retain的地方retain,该release的地方release,还是有可能发生内存泄漏——循环引用。

考虑自习教室的例子,夜深人静,教室里只剩一位同学,而这位同学也该回寝室了——但他发现一个严重的问题,这盏灯怎么关也关不上,作为一个节约用电,有责任感的社会主义好青年,他在教室里守了一夜——关不上灯,他也不走。

其实,这盏灯是杭电自动化学院的最新研究成果——运用了模式识别,声控,红外线探测,脚臭识别等技术,当探测到教室里没人时,会自动关上。

——这便是循环引用导致的内存泄露问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值