39

当尝试使用-retain,-release-dealloc在 Xcode 4.2 中使用自动引用计数构建我的应用程序时,我收到如下错误:

自动引用计数禁止“dealloc”的显式消息发送

为什么我看到这个错误?在自动引用计数下是否不再允许使用-retain-release和?-dealloc

4

4 回答 4

67

基本上:

使用 ARC 时,要么全有,要么全无。编译器要么为你管理所有的保留/释放/释放,要么什么都不做。你不能散布你自己对它们的调用,因为编译器想自己做这一切。它可以通过这样做进行荒谬的优化(例如,在手动内存管理下返回自动释放对象的方法现在可能会产生一个永远不会在自动释放池中结束的对象)。如果您要开始在自己的调用中进行保留和释放,那么编译器将不得不使用这些,并且无法执行它想要的很多优化(并且您应该想要)。

作为额外的奖励,调用-retainCount现在是编译器错误!哦,快乐的一天!

于 2011-06-20T21:53:12.713 回答
1

回应 AliSoftware:我们 CNA 混合了 ARTC 和非 ARC 框架,以及 arc 和非 ARC 源。

(我做的..)

基本思想是:1)编译器将插入/删除调用,就像一个非常优秀的可可程序员可以做的那样 2)可可是无论如何 C 代码,所以我们有单独的编译,所以链接器可以链接由多个来源生成的二进制文件。想想看,我们可以混合 asm 和 cocoa,或者 C 和 pascal...

在主要意见中,c#/java 上的 Appleadvantege 就在这里:我们总是允许混合,并且,使用编译器技术 8non 运行时..)我们可以超越性能。

于 2012-02-04T20:44:11.527 回答
1

在自动引用计数下,不允许保留、释放和释放。

如果您有现有代码,您可以继续使用它,使用 -fno-objc-arc 您可以有选择地禁用任何文件上的 ARC。

如果要在多个文件上禁用 ARC:

在 Xcode PRESS ENTER 中的 Target/Build Phases/Compile Sources 中选择所需的文件。(双击只选择一个文件) 输入 -fno-objc-arc 按 Enter 或 Done

于 2014-12-01T07:07:23.730 回答
0

正如我在Xcode的回答中指出的那样,您可以将特定的源文件编译为非. Dave DeLong的回答有点不对劲。它不包括您可以指示编译器将源编译为非启用项目中的非启用项目(如此所述)。ARCARCARCARC

于 2016-04-17T01:31:44.807 回答