在Xcode 4.2中使用自动引用计数构建应用程序时尝试使用-retain
,-release
和-dealloc
时,出现如下错误:
自动引用计数禁止 显式消息发送'dealloc'
为什么我看到这个错误?自动引用计数不再允许-retain
,-release
和-dealloc
吗?
答案 0 :(得分:67)
基本上:
使用ARC时,它全有或全无。编译器是为您管理所有retainins / release / deallocs,或者它什么都不做。你不能穿插你自己的调用,因为编译器想要自己完成所有操作。它可以通过执行此操作进行荒谬的优化(例如,在手动内存管理下返回自动释放对象的方法现在可能会生成一个永远不会在自动释放池中结束的对象)。如果您要开始使用自己的保留和释放调用,那么编译器必须使用这些并且无法执行它想要的许多优化(并且您应该想要)。
作为一个额外的好处,调用-retainCount
现在是一个编译器错误! OH HAPPY DAY!
答案 1 :(得分:1)
响应AliSoftware:我们CNA混合ARTC和非ARC框架,以及arc和非ARC源。
(我做到了..)
基本思路是: 1)编译器将插入/删除调用作为一个非常非常好的可可程序员可以做 2)cocoa是ANYWAY C代码,因此我们有单独的编译,因此链接器CAN链接由多个源生成的二进制文件。想想因为我们可以混合asm和cocoa,或者C和pascal ......
在主要观点中,关于c#/ java的Appleadvantege就在这里:我们总是允许混合,并且使用COMPILER技术8non运行时..)我们可以超越性能。
答案 2 :(得分:1)
在自动引用计数下,不允许保留,释放和释放。
如果您有现有代码,可以继续使用-fno-objc-arc,可以选择性地禁用任何文件上的ARC。
如果要在MULTIPLE文件上禁用ARC:
在Xcode中的Target / Build Phases / Compile Sources中选择所需的文件 按ENTER键。 (双击只选择一个文件) 键入-fno-objc-arc 按Enter或完成
答案 3 :(得分:0)
正如我在answer Xcode ARC
上指出的那样,您可以将特定的源文件编译为非ARC
。 Dave DeLong的回答有点过时了。它没有包含这样一个事实:您可以指示编译器在启用ARC
的项目中将源代码编译为非ARC
(如here所述)。