0

我正在创建一个用于绘制特定图表的库。如何让它在 ARC 和 MRC 环境中工作?

4

3 回答 3

2

您可以为在 ARC 中不执行任何操作的内存管理调用定义预处理器宏,并在 MRC 中调用适当的方法:

#if __has_feature(objc_arc)
# define ANRelease(obj)
# define ANAutorelease(obj) (obj)
# define ANRetain(obj) (obj)
#else
# define ANRelease(obj) [(obj) release]
# define ANAutorelease(obj) [(obj) autorelease]
# define ANRetain(obj) [(obj) retain]
#endif
于 2013-08-23T09:49:34.657 回答
2

编译后的 MRC/ARC 代码可以从 ARC/MRC 代码中调用——ARC 本质上是一种编译时技术,它自动插入对引用计数内存管理例程的调用。在运行时ARC 和 MRC 代码互操作没有问题。

因此,如果您打算以编译形式发布您的库,您可以使用 MRC 或 ARC 编写它,并且它可以被 ARC 和 MRC 项目使用。

如果您打算以源代码形式发布您的库,那么您可以[是“必须”,请参阅下面的编辑]使用 MRC 编写它。然后,用户可以将您的库代码直接合并到 MRC 项目中。

要将其包含在 ARC 项目中,用户像往常一样添加源,然后对于每个源文件,必须将文件标记为使用 MRC。这是通过在项目设置的 Build Phases 选项卡的 Compiler Sources 部分中选择文件并添加标志来完成的-fno-objc-arc。该标志指示编译器将该特定源文件编译为 MRC。

编辑

上述内容过于强大,通常 ARC 比 MRC 更新,然后要求在 ARC 项目中包含 MRC 源,这是通过使用 . 标记单个 MRC 文件来完成的-fno-objc-arc。然而,同样支持反向操作,您可以通过将各个 ARC 文件标记为-fobjc-arc.

也就是说,Xcode有一个项目范围的设置,在项目设置的“Build Settings”面板中找到“Objective-C Automatic Reference Counting”,设置项目是否为MRC/ARC;并且可以在项目设置的“构建阶段”窗格的“编译源”部分中为单个源文件反转此设置。

最简单的选择是以二进制(编译)形式分发您的库,因为这样可以避免用户设置任何标志。

于 2013-08-23T10:14:02.393 回答
1

你不能。

如果您选择使用 ARC(建议),您有一组限制(例如,您不能手动调用任何内存管理方法),您可以绕过仅将其关闭,这不是一个真正的选择,因为您最终会出现内存泄漏遍布整个代码库。

一个合理的方法是有两个不同的版本,一个带有 MRC,一个带有 ARC,但这似乎是不必要的努力。

-fobjc-arc您的用户可以使用编译器标志将基于 ARC 的库导入非 ARC 项目。

于 2013-08-23T09:21:43.097 回答