理解Objective-C的autorelease
对于iOS的应用程序,为了保持内存的使用效率,系统会严格监视对象的引用计数,当引用计数归0时,对象将被立即释放。一般情况下,用release足够了:alloc/copy/new或者retain一个对象,使用对象,然后用release释放对象。
但考虑这种情况,如果一个方法需要返回一个新建的对象,而这个方法并不是以alloc/copy/new命名,所以调用者肯定不会使用release来平衡返回对象的引用计数,另一方面,我们的方法也不能使用release,因为这样做会将对象立即释放而返回一个空对象
针对这种情况,Objective-C的设计了autorelease,既能确保对象能正确释放,又能返回有效的对象。
听起来有点神奇,它是怎么实现的呢?
好的技术,原理上总是简单的。autorelease的妙处在于,它找到了一个合适的时机来释放返回对象,这个时机就是本次消息循环结束的时候。我们只需要在返回对象前,调用autorelease,对象被加入autorelease pool(但没有减少对象的引用计数,所以这时候返回的对象仍是有效的),然后返回,程序继续执行,直到完成本次消息循环之时,再把autorelease pool中记录的临时对象一个个分别release。
一般来说,消息循环运行一次是毫秒级甚至微秒级的,因此autorelease的效率仍然是非常高的,确实是一个巧妙的设计。
相关推荐
fort0 2020-05-16
81570790 2020-04-16
86540698 2020-04-08
zhoutaifeng 2020-03-07
好好学习天天 2020-03-06
InterestSoul 2020-02-17
82467413 2019-12-31
84407518 2012-07-16
81570790 2013-07-01
83254851 2013-08-29
84334052 2019-11-19
86540698 2019-11-19
84467715 2011-07-25
81731290 2014-03-22
85437811 2014-03-22
dahuichen 2019-10-25
ObjectiveC 2011-09-20
80530297 2015-04-14
80530297 2015-04-20