编写库代码以支持ARC和MRR

时间:2013-10-22 14:47:38

标签: objective-c memory-management automatic-ref-counting

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

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

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

有没有人有这方面的经验,使其干净,易于使用?

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

======

我的问题已经被接受的答案解决了,但作为其他人的提示,我发现a blog post by John Blanco为如何处理我的问题提供了最好的例子。

4 个答案:

答案 0 :(得分:4)

使用ARC并指示将使用该代码的人为每个文件(-fobjc-arc)设置编译标志,并强制他们通过将其添加到标题来执行此操作:

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

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

答案 1 :(得分: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]);

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

只有极少数构造可以出现在头文件中,这些构造在一个或另一个中不起作用。