【问题标题】:refactoring to arc results in "synthesize of 'weak' property is only allowed in arc or gc mode"重构为 arc 导致“仅在 arc 或 gc 模式下允许合成‘弱’属性”
【发布时间】:2012-09-15 02:48:52
【问题描述】:

我正在为 iOS 目标 5.1 使用 xcode 4.4.1 我已经使用 ARC 开始了我的项目,并且在项目中间我向我的项目中添加了一些非 arc 第三方源。 在这一点上,我决定尝试在 xcode 中重构并发生错误。 它来自我的原始源代码之一。

我有一个 (nonatomic, weak) 的属性并且我已经合成了它 ==> 'weak' 属性的合成只允许在 ARC 或 GC 模式下使用。

我很困惑 - 我正在使用 arc,它抱怨它只允许在 arc 中使用??

目前,我已经从其他项目中重构了第三方应用程序并将其复制以供我的项目工作,但以上是我仍然想了解原因的问题。 谢谢! (顺便说一句,当我转换为弧时,它说目标当前使用弧)

【问题讨论】:

  • 在迁移到 ARC 之前设置“弱”属性类型而不是“分配”时遇到此问题

标签: iphone ios4 ios5


【解决方案1】:

听起来问题在于您已经将其设置为 ARC 项目,并且出于某种原因尝试再次对其进行转换。我只能假设该过程不会因此在此阶段出现弱引用。如果您将它们设置为分配然后转换为 ARC,您会看到它会建议您将它们更改为弱。

【讨论】:

    【解决方案2】:

    我在使用面向 iOS 6.1 的 Xcode 4.6.3 时遇到了同样的症状。我从另一个项目中引入了一个非 ARC 类,并通过 Refactor 菜单对其进行了转换,结果导致后续构建在预先存在的类上失败,并出现您看到的错误(“仅在 arc 或 gc 中允许合成‘弱’属性模式”)。

    项目属性清楚地表明它仍然是一个 ARC 项目,但编译器似乎忘记了该类的情况。

    我通过将属性设置为“强”并通过“重构”菜单将该类转换为 ARC 来解决此问题。不出所料,它告诉我没有必要进行任何更改,但确实提供了一个我单击的保存按钮。然后我能够将属性改回“弱”并编译项目。 (我假设某些元数据在此过程中的某个地方不同步。)

    编辑:我最终不得不将其他符合 ARC 的类“重构”为 ARC,因为尽管它们编译它们会生成警告并导致我的应用程序崩溃。我认为这个故事的寓意是,将整个项目包含在重构中可能会更安全......

    【讨论】:

      【解决方案3】:

      改为使用:

      @property(nonatomic,assign)
      

      *note - 这与weak不同,但非常相似。 Weak 还将对象设置为 nil,assign 不会。

      【讨论】:

      • 这不是正确的答案,因为 assign 不是一回事。 Weak 在发布时自动将变量设置为 nil。分配没有。
      • 它们不一样,因为在旧版本的 iOS 中弱不是一个概念。在不允许弱的旧版本 iOS 中,您得到的最接近的方法是手动分配并将变量设置为 nil。
      • 是的,但他的目标是 5.1,所以这不是正确的答案。听起来问题在于他已经将其设置为 ARC 项目,并且出于某种原因试图在之后对其进行转换。这将抛出像描述的那样奇怪的错误消息。例如,如果他按照你说的做然后转换为 ARC,它会建议将它们更改为 Weak :) 奇怪的是,如果你在已经实现 ARC 之后尝试转换它会提前抛出错误
      猜你喜欢
      • 2013-02-15
      • 2014-02-14
      • 2013-09-26
      • 2011-12-08
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多