Objective-C 之NSAutoreleasePool

转载 2011年10月18日 20:17:07

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

 

objective-c中@autoreleasepool的用法

objc中关于自动释放池,有两种语法,一种old-fashioned是:NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //do...
  • mydo
  • mydo
  • 2015-05-21 12:34:49
  • 2330

Objective-C NSAutoreleasePool

一. NSAutoReleasePool自动释放池的简单示例 void main() {     NSAutoReleasePool * pool = [NSAutoReleaseP...
  • nokiaxjw
  • nokiaxjw
  • 2012-09-07 11:13:15
  • 983

@autoreleasepool 代替 NSAutoreleasepool

@autoreleasepool 代替 NSAutoreleasepool  新的xcode的holle world开始给人的印象就是简洁了,可是到底哪里发生了变化呢?原来是原先的NSAutor...
  • yongyinmg
  • yongyinmg
  • 2012-11-04 12:02:37
  • 1526

iOS---NSAutoreleasePool自动释放原理及详解

前言:当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池 定义的作用域内的其它对象可以向它发送消息。当程序...
  • Tongseng
  • Tongseng
  • 2016-08-03 10:53:32
  • 4002

全面深入理解NSAutoreleasePool

先要弄清楚的疑问既然设置了ARC,为什么还要使用@autoreleasepool?ARC 并不是舍弃了 @autoreleasepool,而是在编译阶段帮你插入必要的 retain/release/a...
  • zengxu2011
  • zengxu2011
  • 2015-10-28 11:44:04
  • 554

IOS NSAutoreleasePool

Objective-C的Foundation库实际上是种运行级对象系统,与一般的对象语言,例如C++,Java不一样,而与COM或者Corba一样,对象,不一定创建在用户应用程序的地址空间中,有可能是...
  • ccccdddxxx
  • ccccdddxxx
  • 2014-01-14 13:53:52
  • 1651

关于Object-C的NSAutoreleasePool的学习

NSAutoreleasePool 一般情况不用过多处理。每一个工程的main方法都会自动生成一个NSAutoreleasePool,对象autorelease后,一般不用担心释放问题 也有特殊情况...
  • houchangxi
  • houchangxi
  • 2011-08-15 10:16:35
  • 1606

IOS注意之NSAutoreleasePool

Object-c使用引用计数的方式来管理内存,当一个对象retain,则引用计数+1,对象获得继续存在的保证;当对象release,则引用计数-1,如果这时候引用计数为0,则对象销毁,执行deallo...
  • love_monkey
  • love_monkey
  • 2014-12-05 14:53:44
  • 580

关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法

Xcode是Version 4.2 Build 4D151a 根据Objective-c 2.0程序设计上的旧版本的代码会发生NSAutoreleasePool' is unavailable:...
  • xbl1986
  • xbl1986
  • 2012-01-28 11:46:08
  • 4169

关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法 .

Xcode是Version 4.2 Build 4D151a 根据Objective-c 2.0程序设计上的旧版本的代码会发生NSAutoreleasePool' is unavailable: no...
  • liuyan20092009
  • liuyan20092009
  • 2016-06-17 13:36:23
  • 197
收藏助手
不良信息举报
您举报文章:Objective-C 之NSAutoreleasePool
举报原因:
原因补充:

(最多只允许输入30个字)