Objective-C 之NSAutoreleasePool

原文链接:http://www.newdelete.com/index.php/2011/09/objective-cs-nsautoreleasepool/

 

      今天在看《Cocoa Programming for Mac OS X》内存管理相关的章节。里面提到了Autorelease pool技术,不过书上只是浅尝则止,读起来很不过瘾。我做了个猜测,如下:

      NSAutoreleasePool是一个类,其内应该记录了一队列,用于记录在其上登记的对象指针,比如对象obj,调用了[obj autorelease],那么NSAutoreleasePool中的队列便将其记录下来;

      当调用[NSAutoreleasePool release]方法时,内部遍历队列中的元素,每个元素都release一次;这样就实现了自动释放。

      为了证明自己猜测的正确性,网上查了下资料,大抵如此,没有更神秘的东西。

      在Com编程中,HRESULT GetObject(IUnknown** ppobj)这种风格的方法,几乎可以肯定方法内部会AddRef,但是 IUnknown* GetObject()这种风格的方法,AddRef应该在方法内部做还是调用者做,就真的说不清了。Objective-C中的Autorelease对象正好了解决此问题。然而我觉得还是需要双方约定好才行。比如IUnknown* GetObject()内部傻乎乎的AddRef了一下,即使是Autorelease对象又如何?没有看到函数内部实现,调用者到底还要不要管这个引用计数呢?

      此外,Autorelease对象登记之后,只会保证release一次,别指望它能完全正确释放对象;NSAutoreleasePool虽然支持嵌套,但是何时释放Pool也是破费周折的问题,至于其他的Garbage Collector技术,在内存紧张的应用场景更是显得食之无味。因此,要管理好生命周期还是得靠自己,好在C/C++转过来的程序员,早已经受内存管理的摧残,老老实实的结对调用retain/release吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值