【问题标题】:ios - 'autorelease is unavailable' errors and 'ARC forbids explicit message send of autorelease' errorsios -“自动释放不可用”错误和“ARC 禁止发送自动释放的显式消息”错误
【发布时间】:2013-07-01 19:21:44
【问题描述】:

我有一个运行良好的应用程序。然后我尝试将导航控制器嵌入到 tabbarcontroller 中,接下来我知道我在编译期间开始收到这些错误。

有人知道为什么会这样吗?某些设置是否未选中或被意外选中?

谢谢, 亚历克斯

【问题讨论】:

    标签: ios ios6 automatic-ref-counting reference-counting


    【解决方案1】:

    您之前的工作代码似乎没有使用 ARC,现在您尝试将其嵌入到使用 ARC 的代码中...使用“Edit->Convert->Convert to Object-C ARC”重构您的代码

    【讨论】:

    • 谢谢。我刚试过,它告诉我它不能这样做,因为有一些错误。要查看错误,我必须在常规首选项窗格中选择“错误后继续构建”。但我不确定那是哪个窗格。有什么想法吗?
    • 这意味着你的代码对于重构向导来说太复杂了,你不得不手动重构代码:(
    • @Marting 那么我应该怎么做才能正确设置呢?我应该注释掉所有有错误的语句吗?还是别的什么?
    • 看看 ARC 是如何工作的 - 这基本上意味着您不必自己保留和释放对象,因此要简单得多;) ...但是因为向导无法删除保留,释放,自动发布,它本身可能是你使用了一些桥接魔法,你可能需要小心处理......不过,看看 ARC 是如何工作的,它应该不难融入你的代码中。
    • 我不确定我需要/想要 ARC。要摆脱它,我是否只需将代码的自动释放部分注释掉?
    【解决方案2】:

    ARC 每次翻译都启用 - 每个编译的源文件和它通过包含看到的所有内容都必须遵守 ARC 或 MRC。是的,这些模式可以共存(即,您可以为某些文件启用 ARC,但并非所有文件都可以使用,并且您链接到的库也可以使用)。

    你有两种模式:

    ARC

    表达式[obj autorelease] 被禁止。 ARC 会为您添加它(除非您有不寻常的引用计数序列)。

    在典型的场景下,你可以写:

    // a method which returns an autoreleased object
    - (NSArray *)something
    {
      return [[NSArray alloc] initWithObjects:…YOUR_OBJECTS…];
    }
    

    然后 ARC 会为您添加 autorelease

    但是如果你写:

    - (NSArray *)something
    {
      return [[[NSArray alloc] initWithObjects:…YOUR_OBJECTS…] autorelease];
    }
    

    在 ARC 中,这将是一个编译错误(就像您标题中的错误)。

    MRC

    这是 MRC 表格:

    - (NSArray *)something
    {
      return [[[NSArray alloc] initWithObjects:…YOUR_OBJECTS…] autorelease];
    }
    

    您的项目可能默认使用 ARC(即它在 xcconfig、项目级别或目标级别定义),尽管您添加了一个为 MRC 编写的源文件。

    由于文件被编译为 ARC,您可以删除 autorelease 消息或 disable ARC for the single file

    【讨论】:

    • 所以我应该阅读那个自动发布部分吗?这能解决问题吗?
    • @Genadinik 如果这个源文件仍然被另一个项目使用,你应该在禁用 ARC 的情况下编译它(因为'他们'在没有 ARC 的情况下编译它,你会通过删除它们依赖的引用计数操作来引入问题在)。如果该文件未在其他项目中使用,则继续删除它(如果迁移失败)。尽管它们非常罕见,但请留意不寻常的引用计数操作。
    【解决方案3】:

    错误出现在新代码上?

    在这种情况下,我认为您的项目启用了 ARC,当您尝试嵌入 UINavigationController 时,您插入了一些非 ARC 代码。

    你改编译器了吗?

    LLVM 编译器引入了 ARC。如果您正在开发一个非 ARC 项目,那么您可能只是使用 LLVM 编译而破坏了您的代码。

    尝试重构代码。 Check this.

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2012-03-16
    • 2023-03-12
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多