在自动引用计数下,为什么不允许保留,释放和释放?
当在Xcode 4.2中使用自动引用计数构build我的应用程序时,尝试使用-retain
, -release
和-dealloc
时,出现如下错误:
自动引用计数禁止“dealloc”的显式消息发送
为什么我看到这个错误? 在自动引用计数下,是否-dealloc
, -release
,和-dealloc
不再允许?
基本上:
使用ARC时,全是或者全无。 编译器正在为你pipe理所有的retain / release / deallocs,或者它什么也不做。 你不能散布你自己的调用,因为编译器本身就是要做的。 通过这样做可以做出荒谬的优化(例如,在手动内存pipe理下返回自动释放对象的方法现在可能会产生永远不会在自动释放池中结束的对象)。 如果你开始在自己的调用中保留和释放,那么编译器将不得不使用它们,并且不能执行它想要的许多优化(并且你应该想要)。
作为一个额外的好处,调用-retainCount
现在是一个编译器错误! 哦,快乐的一天!
回应AliSoftware:我们CNA混合ARTC和非ARC框架,也弧和非ARC源。
(我做的..)
基本的想法是:1)编译器将插入/删除调用作为一个非常好的cocoa程序员可以做2)cocoa是ANYWAY C代码,所以我们有单独的编译,所以链接器CAN链接由多个来源产生的二进制文件。 认为它,我们可以混合asm和cocoa,或C和pascal …
在主要观点的Appleadvantege在C#/ Java是在这里:我们总是允许混合,并且,使用COMPILER技术8non运行时..)我们可以超越performance。
在自动引用计数下,不允许保留,释放和释放。
如果你有一个现有的代码,你可以像使用-fno-objc-arc一样继续使用它,你可以在任何文件上select性地禁用ARC。
如果你想在MULTIPLE文件上禁用ARC:
在Xcode的目标/构build阶段/编译源中select所需的文件按PRESS ENTER。 (双击只select一个文件)Type -fno-objc-arc按Enter或Done
正如我在Xcode ARC
上的回答中指出的那样,您可以将特定的源文件编译为非ARC
。 戴夫德隆的回答是有点偏离。 它不包括这样一个事实,即您可以指示编译器将源代码编译为非ARC
源代码(如此处所述)。