在非ARC项目中使用ARC库

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

有错误的行:

id *_controls; 

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

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

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

由于它是在一个头文件中,您将需要使用#if编译指示来切换行为,具体取决于是否正在编译ARC或非ARC .m文件。

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

如果是伊娃,完全摆脱宣言。 要么通过@property公开它,要么将它移动到.m文件,如果它不需要公开的API公开的API。 鉴于types,它实际上应该是一个私有的公共API实现细节,使访问的内容less一点指针魔术。


通常,使用C语言数组(指针数组)来存储Objective-Ctypes是非常令人沮丧的。 如果_controls需要作为一个可公开访问的东西公开(在你的项目中公开给其他类),然后重构你的代码来使用一个集合类(即通常是一个暴露的NSArray* getter与一个内部唯一的NSMutableArray*后备存储 – – 例如UIView subviews )。

正如你在评论中所说的那样,预编译的头文件包含了一个类头文件,这个文件不能用ARC编译。 这导致了错误,因为预编译的头文件也包含在所有用ARC编译的SBJson文件中。

我build议你从.pch文件中删除这个类头文件,并只在需要的时候从非ARC源文件中包含它。