深入理解Objective-C: Autorelease Pool (自动释放池)

本文详细介绍了Objective-C中的自动释放池(Autorelease Pool)的工作原理和使用,包括对象销毁、创建autorelease pool、AutoreleasePoolPage以及Autorelease Pool Blocks的相关操作。在iOS开发中,自动释放池对于内存管理至关重要,了解其内部机制能有效防止内存泄漏,提高程序性能。
摘要由CSDN通过智能技术生成

代码

官方文档NSAutoreleasePool 传送门

官方文档NSAutoreleasePool个人翻译 传送门

在MRC环境下

   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   [pool release];

在ARC or MRC 环境下均可使用

    @autoreleasepool {
    }

内存管理

关于NSAutoReleasePool的理解 传送门

Cocoa的内存管理主要依赖于Reference Counting, 而NSAutoReleasePool就是用来支持它的。
Autorelease pool中存放的对象会在其自身干枯(drain)时被release

对象的销毁

我们都知道当一个objectrelease方法被触发时, 这个对象就被销毁了, 再也不能对它有任何引用, 否则就会出现异常。
但如果在销毁它时触发的是autorelease方法, 那这个object就进入了对应的autorelease pool, 它的生命就被延长了(当pool drain时才真正被销毁).

在引用计数的环境中,Cocoa期望有一个可以随时可用的自动释放池。如果一个池不可用,则自动释放的对象不会被释放,您会泄漏内存。在这种情况下,您的程序通常会记录适当的警告消息。

应用程序包在事件循环的每一个循环开始时在主线程上创建一个自动释放池,并在结束时将其耗尽,从而释放在处理事件时生成的任何自动释放的对象。如果您使用的是应用程序包,那么您通常不需要创建自己的池。如果您的应用程序在事件循环中创建了许多临时的自动回调对象,那么创建“本地”自动回调池将有助于最小化峰值内存占用。

创建autorelease pool

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的增大, 可以手动创建一些autorelease pool用来drain objects.
2、创建新的thread, 并在其中访问了Cocoa, 需要在访问的前创建autorelease pool, 访问结束后drain.

最后一点, 在每个thread中都会维持一个stack(栈堆), 其中放置着所有在这个thread中创建但未销毁的pool, 每当一个新的pool创建后, 它就位于stack的最顶端, 相应autoreleased object就会放入其中. 当pool drain的时候, 它就会从stack的顶端移除, 并且release掉其包含的objects`.

AutoreleasePoolPage

在MRC环境下,我们可以看到-[NSAutoreleasePool release]方法最终是通过调用 <

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值