在非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源文件中包含它。