原文链接: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吧。