NSAutoReleasePool个人理解

本文详细介绍了NSAutoReleasePool的工作原理及其用法。NSAutoReleasePool用于管理Objective-C中自动释放对象的生命周期,通过创建和释放自动释放池来管理autorelease对象,避免内存泄漏。文章还讨论了在多线程环境下自动释放池的必要性和使用场景。

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

NSAutoReleasePool

顾名思义,自动释放池,在这个池子里,创建时声明autorelease的对象可以被自动释放。

用法:

NSAutoRelesePool *pool = [[NSAutoRelease alloc] init];

//doSomething

[pool drain];

1、pool创建时为池子的开始,调用drain时意味着结束,此时里面的全部autorelease对象立即被release,从内存中释放。

2、pool只能用alloc+init 创建,不能用autorelease创建,也不能被retain和release,因为调用drain后就已经默认释放了自己。


在引用计数机制作用下,main tread是有一个自动释放池的,我们平时autorelease的对象实际上是被扔到了系统的这个自动释放池中。


那么我们什么情况下需要手动创建autoreleasepool呢?

cocoa希望每一个线程都有一个autoreleasepool,如果不存在,那些被autoreleasede的对象就不会被销毁,从而产生momory leak,所以在下列情况下我们应该使用NSAutoReleasePool

  1. 在main thread中, 在某个方法中出现大量的autoreleased objects, 为了避免memory footprint的增大, 可以手动创建一些autorelease pool用来drain objects.
  2. 创建新的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、付费专栏及课程。

余额充值