【问题标题】:Using ARC library in non-ARC project [closed]在非 ARC 项目中使用 ARC 库 [关闭]
【发布时间】:2013-05-11 10:03:14
【问题描述】:

我的项目中没有使用 ARC 技术。我正在尝试向其中添加 SBJson 库。我为所有具有 SBJson 前缀的文件设置了 -fobjc-arc 标志,但在编译过程中,ARC 语义问题(指向非 const 类型“id”且没有明确所有权的指针)出现在一个与 SBJSon 无关的类头中。为什么它不起作用?

有错误的行:

    id *_controls;

由于项目的商业许可,我无法向您展示我的代码,感谢您的理解。

当我使用这个库的旧版本(没有 ARC)时,项目编译正常。

【问题讨论】:

  • 你能不能至少给出错误所在的行
  • 试试 id _controls;没有 *
  • 如果你只为SBJson文件设置了-fobjc-arc,为什么你的代码id *_controls;是用ARC编译的?
  • 这是我提出问题的实际原因。
  • 在你的项目文件上尝试一个明确的-fno-objc-arc(尤其是那个抛出错误的文件)。

标签: ios objective-c automatic-ref-counting sbjson


【解决方案1】:

问题是您通过包含将违反 ARC 的构造混合到 ARC 文件中。您不能将-fno-objc-arc 应用于单个头文件,因为这没有意义。

由于它位于头文件中,因此您需要使用 #if 编译指示在行为之间切换,具体取决于正在编译 ARC 还是非 ARC .m 文件。

不过,更好的解决方案是完全消除 ARC 和非 ARC 的问题。鉴于该声明,它几乎必须是一个实例变量(尽管它可能在一个结构中)。

如果它是 ivar,则完全摆脱声明。如果不需要在公共 API 中公开,请通过 @property 公开它或将其移动到 .m 文件。给定类型,它确实应该是一个带有公共 API 的私有实现细节,这使得访问内容的指针魔法少了一点。


一般来说,强烈建议不要使用 C 语言数组(指针数组)来存储 Objective-C 类型。如果_controls 确实需要公开为可公开访问的事物(对项目中的其他类公开),则重构您的代码以使用集合类(即通常是公开的NSArray* getter 和仅限内部的@987654326 @ 后备商店——例如 UIView 上的 subviews)。

【讨论】:

    【解决方案2】:

    正如您在 cmets 中所说,预编译的头文件包含一个不打算使用 ARC 编译的类头文件。这是导致错误的原因,因为预编译的头文件也包含在使用 ARC 编译的所有 SBJson 文件中。

    我建议您从 .pch 文件中删除该类头文件,并仅在需要时从非 ARC 源文件中包含它。

    【讨论】:

    • 很遗憾,我无法从 .pch 中删除此文件。但我决定使用 SBJSon 的静态库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多