Objective C 中的release, retain, autorelease再加上垃圾回收,对于初学者经常搞的晕头转向,很难彻底理解,既然有release,为何还要autorelease? autorelease是否就是垃圾回收? 我们结合汽车变速箱中离合器的控制来理解一下。
可以这样简化来考虑:
一,没有垃圾回收
retain/release是最基本的,一个增加计数,一个减少引用计数,创建对象后,我们只要适当的时候release就ok了。
autorelease一般用在stringWithString这样比较爽的对象创建+初始化的静态函数中,跟release差不多,唯一的区别是你不用手工去release了,相当于在后台有一个机器人帮你release。
二,有垃圾回收
基本上可以忘掉release和autorelease了,只是适当的时候用一下retain,防止被系统过早回收。
这让我联想到汽车变速系统中的AT, MT, AMT,对于离合器的处理方法:
MT是手动档,要你自己踩离合,相当于release
可以这样简化来考虑:
一,没有垃圾回收
retain/release是最基本的,一个增加计数,一个减少引用计数,创建对象后,我们只要适当的时候release就ok了。
autorelease一般用在stringWithString这样比较爽的对象创建+初始化的静态函数中,跟release差不多,唯一的区别是你不用手工去release了,相当于在后台有一个机器人帮你release。
二,有垃圾回收
基本上可以忘掉release和autorelease了,只是适当的时候用一下retain,防止被系统过早回收。
这让我联想到汽车变速系统中的AT, MT, AMT,对于离合器的处理方法:
MT是手动档,要你自己踩离合,相当于release
AT是自动档,没有离合了,相当于系统垃圾回收
AMT是在手动档的基础上实现的自动换档功能,相当于请了一个司机来帮你踩离合,相当于autorelease,表面上看你都不用自己踩离合和release了,实际上背后有个人帮你做。