NSAutoreleasepool

Cocoa的内存管理主要依赖于Reference Counting, 而NSAutoReleasePool就是用来支持它的.

autorelease pool中存放的对象会在其自身干枯(drain)时被release.

我们都知道当一个object的release方法被触发时, 这个对象就被销毁了, 再也不能对它有任何引用,

否则就会出现异常. 但如果在销毁它时触发的是autorelease方法, 那这个object就进入了对应的autorelease pool,

它的生命就被延长了(当pool drain时才真正被销毁).

在Reference Counting的环境里, Cocoa总是期望在每一个thread都存在一个autorelease pool, 如果不存在,

那些被autoreleased的objects就不会被销毁, 从而产生memory leak.

NSAutoReleasePool的初始化与普通的NSObject一样, 都是alloc+init, 不过pool不能被retain, 因为在drain的时

候默认就销毁它自身了. 还有一点需要注意的是, 通常在销毁pool的时候用的不是它的release方法, 而是drain!

原因是为了让程序同时兼容Reference Counting内存管理环境 与 Garbge Collection环境, 因为在

Garbage Colloection环境中drain的作用是触发collect garbage动作.

一般来说在应用的main thread中, 已经存在了一个autorelease pool. 有两种情况需要开发者自己新建autorelease pool:

  1. 在main thread中, 在某个方法中出现大量的autoreleased objects, 为了避免memory footprint的增大, 可以手动创建
  2. 一些autorelease pool用来drain objects.
  3. 创建新的thread, 并在其中访问了Cocoa, 需要在访问的前创建autorelease pool, 访问结束后drain.

最后一点, 在每个thread中都会维持一个stack, 其中放置着所有在这个thread中创建但未销毁的pool, 每当一个新的

pool创建后, 它就位于stack的最顶端, 相应autoreleased object就会放入其中. 当pool drain的时候, 它就会从stack的

顶端移除, 并且release掉其包含的objects.

你可能感兴趣的:(auto)