NSAutoreleasePool错误

照着电子书敲了一段代码,Run,报错:

'NSAutoreleasePool' is unavailable: not available in automatic reference counting mode

百度之后,发现原来是书太老,自己用的是xcode4.6。 按照高人的做法,打开工程属性-->Build settigns,找到:

Objective-C Automatic Reference Counting


原理这个值是YES,修改其为NO.


再次run,OK.


不过对 NSAutoreleasePool不甚了解,只是大概知道事引用计数的东东,记录两篇文章,以后再琢磨:

http://eleda.iteye.com/blog/1108700

http://blog.csdn.net/zltianhen/article/details/6599244



<think>好的,我现在需要回答用户关于Objective-C中的drain方法的作用的问题。首先,我要确认自己对drain的理解是否正确。记得在早期的Objective-C中,特别是在手动引用计数(MRC)的环境下,NSAutoreleasePool的管理非常重要。自动释放池用于延迟对象的释放,当调用autorelease方法时,对象会被添加到当前的自动释放池中。 用户提到drain方法,这让我联想到NSAutoreleasePool的drain方法。根据记忆,drain的作用是释放自动释放池中的所有对象,同时可能做一些清理工作。不过在MRC时代,drain和release有什么区别呢?我需要查阅相关资料确认。 查资料发现,在MRC下,NSAutoreleasePool的drain方法会触发池中所有对象的release操作,并且释放池本身。而在垃圾回收的环境下(虽然iOS从未支持过GC),drain会有不同的行为,但iOS主要使用MRC和后来的ARC,所以可能用户的问题更多涉及MRC的情况。 另外,在ARC环境下,虽然开发者不需要手动管理autoreleasepool,但使用@autoreleasepool块来管理内存仍然是必要的,尤其是在循环中创建大量临时对象时。这时候,自动释放池的drain可能在块结束时自动调用。 需要澄清的是,drain在MRC下与release的区别。根据苹果文档,在MRC中,调用[pool drain]会释放池中所有自动释放的对象,并且销毁池本身。而release同样会释放池,但可能在垃圾回收环境下有不同的处理。不过iOS没有垃圾回收,因此在MRC中,drain和release的效果可能相同,但推荐使用drain,因为它在有GC的环境下行为更正确,同时代码更易移植。 因此,总结drain的作用:在手动引用计数环境下,NSAutoreleasePool的drain方法用于释放池中所有已注册autorelease的对象,并销毁自动释放池。在ARC中,通常使用@autoreleasepool块,不需要显式调用drain,因为块结束时自动处理。</think>在Objective-C的**手动引用计数(MRC)**时代,`NSAutoreleasePool`的`drain`方法用于**释放自动释放池中的所有对象并销毁池本身**。它的核心作用与使用场景如下: --- ### **关键作用** 1. **释放延迟释放的对象** - 当对象调用`autorelease`方法时,会被添加到当前`NSAutoreleasePool`中 - `drain`会触发池中所有对象的`release`操作(但池本身的内存销毁要等到`release`调用) 2. **管理内存峰值** - 在循环中创建大量临时对象时,通过`drain`及时释放内存,避免内存暴涨 --- ### **MRC时代典型代码** ```objectivec // 手动创建自动释放池 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // 创建大量临时对象(自动加入当前池) for (int i = 0; i < 10000; i++) { NSString *tempStr = [NSString stringWithFormat:@"obj%d", i]; // tempStr 自动调用 autorelease } // 释放池中所有对象(立即回收内存) [pool drain]; // 等同于 [pool release],但drain在GC环境下有特殊处理(iOS无GC) ``` --- ### **与`release`的区别** | 方法 | 行为 | |-----------|--------------------------------------------------------------------| | `drain` | 1. 释放池中所有对象<br>2. 在**有垃圾回收(GC)**的环境下触发GC(iOS不适用) | | `release` | 直接减少池的引用计数(可能导致池立即销毁) | > 在**没有GC的环境**(如iOS)中,`drain`与`release`效果相同,但苹果推荐使用`drain`以保证代码可移植性。 --- ### **ARC时代的替代方案** 在**自动引用计数(ARC)**下,使用`@autoreleasepool`语法糖更安全高效: ```objectivec @autoreleasepool { for (int i = 0; i < 10000; i++) { NSString *tempStr = [NSString stringWithFormat:@"obj%d", i]; // 池会在块结束时自动drain } } ``` --- ### **典型使用场景** 1. 循环内创建大量临时对象 2. 多线程任务开始时创建独立自动释放池 3. 需要严格控制内存峰值的场景(如图像处理) **注意**:在ARC环境下直接调用`drain`会导致编译错误,必须通过`@autoreleasepool`块管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值