这可能是一个愚蠢的问题,但我只是想知道。我希望我的代码以编程方式检测是否启用了 ARC。我怎么做?有什么可以检查的标志吗?其实问题是,我写了一个开源库。我用过release
和retain
在里面。如果其他人在启用 ARC 的情况下使用我的库文件,我不希望他们出现任何错误。我该如何做到这一点?或者有什么可能的方法可以在使用之前提供任何工具来编译我的库?
问问题
1890 次
3 回答
19
#if !__has_feature(objc_arc)
//Do manual memory management...
#else
//Usually do nothing...
#endif
这当然是编译时检查,您不能在运行时检查 ARC。
另一种方法是为-fno-objc-arc
在使用 ARC 的项目中使用手动内存管理的文件设置编译器标志。
无论您是想为此烦恼还是只是在任何地方使用 ARC,都取决于您想要/需要的向后兼容程度。同时支持 ARC 和 MRC 的代码可能很难阅读和维护。
于 2012-05-22T11:05:37.687 回答
2
您不会以编程方式检测到它,它基于translations运行。也就是说,它不像垃圾收集——它是进程范围的,需要所有链接库来支持(并在该模式下正确实现它)。您可以使用 ARC 编译一些文件,而有些则不用。
至于你的图书馆的分布:我不会打扰基于翻译的系统,其中引用计数操作是有条件地启用的。我会(个人)只支持一种模型(在您的情况下为 MRC,直到您选择将其迁移到 ARC),然后期望人们链接到该库,或者如果他们在他们配置的目标中编译它,以禁用 ARC。基于功能的存在有条件地启用/禁用代码是要求出现棘手的错误,特别是当它可能会影响库中 9% 的代码行时。
于 2012-05-22T11:04:12.157 回答
1
不,你不能,如果你的源代码使用了 retain-release,Xcode 就不会在 ARC 项目中编译
于 2012-05-22T11:05:15.637 回答