-2

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

有错误的行:

    id *_controls;

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

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

4

2 回答 2

3

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

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

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

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


通常,强烈建议不要使用 C 语言数组(指针数组)来存储 Objective-C 类型。如果_controls确实需要公开为可公开访问的事物(对项目中的其他类公开),则重构您的代码以使用集合类(即,通常是NSArray*具有仅内部NSMutableArray*后备存储的公开 getter - 例如subviewson UIView,对于例子)。

于 2013-05-16T14:41:46.427 回答
0

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

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

于 2013-05-16T14:39:38.097 回答