编写库代码以支持 ARC 和 MRR



我正在开发一个库,我想在一个代码库中支持两种内存管理方法(ARC 和 MRR)。

我不想强迫用户为我的代码使用特殊标志(-fobjc-arc)。

我知道预处理器测试:#if __has_feature(objc_arc),但是使用它来涵盖所有差异的最佳实践是什么?

有没有人对此有任何经验,使其干净且易于使用?

更好的方法是使用一些宏在 ARC 和非 ARC 之间进行转换,我可以在我的代码中使用这些宏。

=======

==

我的问题

被接受的答案解决了,但作为对其他人的提示,我找到了约翰·布兰科的一篇博客文章,给出了如何处理我的问题的最佳示例集。

在 github 中引用 MBProgressHUD 的代码。我想,这就是你想要的。

#if __has_feature(objc_arc)
#define MB_AUTORELEASE(exp) exp
#define MB_RELEASE(exp) exp
#define MB_RETAIN(exp) exp
#else
#define MB_AUTORELEASE(exp) [exp autorelease]
#define MB_RELEASE(exp) [exp release]
#define MB_RETAIN(exp) [exp retain]
#endif

这就是他们使用这些宏的方式

self.indicator = MB_AUTORELEASE([[MBRoundProgressView alloc] init]);

要么使用 ARC 并指示将使用代码的人为每个文件(-fobjc-arc)设置编译标志,并通过将其添加到标头来强制他们这样做:

#if !__has_feature(objc_arc)
  #error ARC must be enabled!
#endif

或者在启用 ARC 的情况下构建为库/框架。
将内存管理代码包装在预处理器指令中是一个糟糕的主意。

同时支持 ARC 和非 ARC 代码的一种方法是转到"目标"、"构建阶段"和"编译源代码"部分。

从那里你应该看到所有的.m文件。然后,您可以添加到编译器标志下的任何文件 -fno-objc-arc,以告诉编译器忽略 ARC。

是的,不要这样做。 对于每次更改,您最终都必须对代码进行两次全面测试。 并调试所有内容两次。 不值得付出努力。

你真的写你的代码纯粹的ARC或纯粹的非ARC。

很少有构造

可以出现在头文件中,而这些构造在一个或另一个中不起作用。

最新更新