【问题标题】:Under automatic reference counting, why are retain, release, and dealloc not allowed?自动引用计数下,为什么不允许retain、release、dealloc?
【发布时间】:2011-09-10 12:40:47
【问题描述】:

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

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

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

【问题讨论】:

  • 您找到其他解决方案了吗?

标签: objective-c automatic-ref-counting


【解决方案1】:

基本上:

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

另外,调用-retainCount 现在是编译器错误!哦,快乐的一天!

【讨论】:

  • 这是否意味着您不能在使用 ARC 的项目中使用使用保留或释放的框架?如果编译器改为删除用户的“手动”保留/释放调用,用自己的替换它,这样它就可以在 ARC 中编译以前的代码或外部库,这不会更好项目?
  • @AliSoftware 是的,您仍然可以使用这些框架。 retain/release 的问题在于编译时,而不是运行时。
  • 感谢 Dave 的精确度......但是外部代码呢(有时因滥用语言而被错误地称为“框架/库”,但更多的是“未编译的代码包”),例如,比如,ASIHTTPRequest、Reachability.h/.m 之类的? (其实我就是这么想的)
  • @AliSoftware - ARC 与使用手动引用计数构建的框架完全兼容。这与垃圾收集不同,您需要拥有与 GC 兼容的框架构建才能与 GC 应用程序兼容。
  • @贾斯汀Mike Ash has some good info on it。它涉及一些巫术来查看先前的堆栈帧以查看调用自动释放的内容。在某些情况下,自动释放将永远不会发生。 (这就是objc_retainAutoreleaseReturnValue 位)
【解决方案2】:

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

(我做到了..)

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

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

【讨论】:

    【解决方案3】:

    在自动引用计数下,不允许retain、release、dealloc。

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

    如果您想在 MULTIPLE 文件上禁用 ARC:

    在 Xcode 的 Target/Build Phases/Compile Sources 中选择所需的文件 按回车。 (双击只选择一个文件) 类型 -fno-objc-arc 按 Enter 或完成

    【讨论】:

      【解决方案4】:

      正如我在Xcode ARC 上的answer 中指出的,您可以将特定 源文件编译为非ARCDave DeLong 的回答有点不对劲。它不包括您可以指示编译器在启用ARC 的项目中将源代码编译为非ARC(如here 所述)。

      【讨论】:

        猜你喜欢
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-23
        相关资源
        最近更新 更多