【问题标题】:autorelease not allowing to compile code自动释放不允许编译代码
【发布时间】:2012-09-07 23:20:08
【问题描述】:

我正在尝试将旧代码转换为 ARC 代码。 但是,我在以下行收到构建错误

[[token retain] autorelease];

我按以下顺序收到 3 个错误:

-'autorelease'不可用:在自动引用计数模式下不可用

-[rewriter] 删除未使用的“自动释放”消息是不安全的;它的接收器可能会立即被销毁

-ARC 禁止“自动释放”的显式消息发送

如果我删除此特定行,则代码编译正确

【问题讨论】:

  • stackoverflow.com/questions/9865847/… 这应该会有所帮助。
  • @ratbum 是正确的。我已经完成了这些步骤,但是当我转到“编辑”->“重构”->“Objective-c ARC”然后选择要转换的相关文件并单击“检查”时,我在这个特定的地方得到一个错误行

标签: objective-c ios


【解决方案1】:

如果仅此而已,您可能可以将其删除。该代码声明了对该对象的引用,但也表示您不想担心稍后发布,但使用 ARC 您不必担心。

我猜 Xcode 没有自动摆脱它是因为缺少上下文。如果它位于更常见的位置,例如在 return 语句中,那么意图是什么就很明显了。当它完全独立时,它可能是,但可能不是,更复杂的东西。

【讨论】:

    【解决方案2】:

    ARC 为您管理内存,因此您无需调用“autorelease”、“release”、“retain”等。使用 ARC,编译器会根据需要保留和释放对象,因此您不必明确地进行这些调用。如果您想手动管理内存禁用 ARC,或者您可以使用编译器标志“-fno-objc-arc”来禁用特定类的 ARC。

    【讨论】:

    • 是的,但是如果我应该要求 Xcode 将我的文件转换为 ARC,是否有责任将任何引用转换为“autorelease”或“release”或“retain”...保留和释放调用已经存在于文件的其他部分。但只有这一行显示错误
    • @jerry 去掉行首多余的“[”和“autorelease];”即可
    • 非常感谢...现在正在编译。你能解释一下为什么它会出错吗??
    • @jerry 我在我的帖子中解释说,当启用 ARC 时,编译器被教导在您尝试手动管理内存的任何地方显示错误,以向您显示您不应该尝试这样做.使用 ARC 会自动处理任何保留/释放调用。如果我的帖子对您​​有所帮助,请点击我帖子旁边的“复选标记”将我的帖子标记为正确。
    【解决方案3】:

    ARC 意味着您不必使用释放、保留或其他讨厌的内存管理工具。 ARC 会在您编译应用程序时自动为您添加它们。 Read more here

    如果您的旧代码不是删除所有内存管理调用的最佳解决方案,那么check this answer to disable ARC for particular files

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多