(1)objective c 入门之NSAutoreleasePool

本文详细介绍了 Xcode 4.3 弧形计数模式下如何正确使用 NSAutoreleasePool,包括解决 ARC 下 NSAutoreleasePool 的错误、使用 drain 和 release 方法的区别,以及在 iOS5 中引入 AppDelegate 的必要性。同时,提供了关于 NSAutoreleasePool 机制的深入理解。

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

xcode4.3引入了arc,但我是新手,很多时候更愿意拿着书中的例子进行调试.如果新建程序时没有注意勾选了use automatic reference counting,那么新建的程序中就只能调用@autoreleasepool.如果照搬书上的NSAutoreleasePool 则会出现

"NSAutoreleasePool' is unavailable: not available in automatic reference counting mode"的error.

解决方法是把arc(auto-reference-command)关闭才行,方法如下:

Build settings--->Apple LLVM compiler 3.0- Language--->Objective-C Automatic Reference Counting 将YES改为NO。

如果是ios5 需要在main的头部引入 #import "AppDelegate.h" 才可以解决。



虽然ARC引入之后NSAutoReleasePool的使用有了很大变化,但是了解NSAutoReleasePool的机制还是十分必要的,下面主要说一下:

NSAutoreleasePool * pool = [NSAutoReleasePool alloc] init];

//do something

之后,

[pool drain] 和 [pool release] 的区别:

release,在引用计数环境下,由于NSAutoreleasePool是一个不可以被retain的类型,所以release会直接dealloc pool对象。当pool被dealloc的时候,pool向所有在pool中的对象发出一个release的消息,如果一个对象在这个pool中autorelease了多次,pool对这个对象的每一次autorelease都会release。在GC环境下release是一个no-op操作(代表没有操作,是一个占据进行很少的空间但是指出没有操作的计算机指令)。

drain,在引用计数环境下,它的行为和release是一样的。在GC的环境下,这个方法调用objc_collect_if_needed出发GC。

因此,重点是:在GC环境下,release是一个no-op,所以除非你不希望在GC环境下出发GC,你都应该使用drain而不是使用release来释放pool。



名词解释

no op(或no-op),代表没有操作,是一个占据进行很少的空间但是指出没有操作的计算机指令。计算机处理器只是移到下个继续的指令。no op 被包含在大多数的汇编语言中。它可能有一个标签并且能为一个在代码发展期间稍后将被插入的有用的指令作一个占位符号。新电脑黑客字典报告如一个引申意义 "对一个项目毫无贡献或在楼上什么也不做的人,或两者兼而有之。 '他是一个no-op。'中就是这个意思"。


此文参考资料:

1.http://blog.youkuaiyun.com/c395565746c/article/details/7613814

2.http://blog.sina.com.cn/s/blog_5dce657a0100zjpg.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值