在非ARC项目中使用ARC库

时间:2013-05-16 13:23:21

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

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

有错误的行:

    id *_controls;

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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


通常,非常不鼓励使用C语言数组(指针数组)来存储Objective-C类型。如果_controls确实需要作为可公开访问的内容公开(对项目中的其他类公开),那么重构代码以使用集合类(即通常是具有内部的公开NSArray* getter - 仅NSMutableArray*支持商店 - 例如subviews上的UIView

答案 1 :(得分:0)

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

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