NSAutoreleasepool

本文探讨了Cocoa内存管理中的ReferenceCounting机制,并深入解析了NSAutoReleasePool的工作原理及其在不同场景下的使用方法。文章还介绍了如何避免内存泄漏,以及在多线程环境下正确使用NSAutoReleasePool的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值