0

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

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

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

有没有人有任何经验可以使它干净且易于使用?

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

=========

我的问题已通过接受的答案解决,但作为对其他人的提示,我发现John Blanco 的一篇博客文章给出了如何处理我的问题的最佳示例。

4

4 回答 4

4

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

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

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

于 2013-10-22T15:14:09.243 回答
4

参考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]);
于 2013-10-22T15:22:41.330 回答
1

支持 ARC 和非 ARC 代码的一种方法是转到 Target、Build Phases 和 Compile Sources 部分。

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

于 2013-10-22T15:12:11.643 回答
1

是的,不要这样做。您最终将不得不为每次更改完全测试您的代码两次。并调试一切两次。这不值得努力。

您真的很想编写纯 ARC 或纯非 ARC 的代码。

很少有结构可以出现在头文件中,而这些结构在其中一个或另一个中都不起作用。

于 2013-10-22T16:07:02.197 回答