我正在创建一个用于绘制特定图表的库。如何在ARC和MRC环境中使其工作?
答案 0 :(得分: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
答案 1 :(得分:2)
编译可以从ARC / MRC代码调用MRC / ARC代码 - ARC本质上是一种编译时技术,可自动插入对引用计数内存管理例程的调用。在运行时 ARC& MRC代码可以毫无问题地互操作。
因此,如果您打算以编译形式运送您的库,您可以使用MRC或ARC编写它,它可以被ARC& MRC项目。
如果您打算以源代码形式发送库,那么您可以 [必须“,请参阅下面的编辑] 使用MRC编写它。然后,用户可以将库代码直接合并到MRC项目中。
要将其包含在ARC项目中,用户照常添加源,然后对于每个源文件,必须使用MRC将文件标记为。这是通过在“项目”设置的“构建阶段”选项卡的“编译器源”部分中选择文件并添加标记-fno-objc-arc
来完成的。该标志指示编译器将该特定源文件编译为MRC。
修改强>
上述情况过于强烈,一般来说,ARC比MRC更新,然后要求在ARC项目中包含MRC源,这是通过用-fno-objc-arc
标记各个MRC文件来完成的。但是,反过来同样支持,您可以通过使用-fobjc-arc
标记各个ARC文件,在MRC项目中包含ARC源。
换句话说,Xcode在项目设置的“Build Settings”窗格中有一个项目范围的设置,“Objective-C Automatic Reference Counting”,用于设置项目是否为MRC / ARC;对于单个源文件,可以在项目设置的“构建阶段”窗格的“编译源”部分中反转此设置。
最简单的选择是以二进制(编译)形式分发您的库,因为这可以避免用户设置任何标志。
答案 2 :(得分:1)
你不能。
如果你选择使用ARC(建议)你有一套限制(例如你不能手动调用任何内存管理方法),你可以绕过它只关闭它,这不是一个真正的选择,因为你最终会内存泄漏遍及整个代码库。
一个合理的方法是有两个不同的版本,一个是MRC,一个是ARC,但这似乎是一种不必要的努力。
您的用户可以使用-fobjc-arc
编译器标记将基于ARC的库导入非ARC项目。