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的头部引入
虽然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