Objective c 编写库代码以支持ARC和MRR

Objective c 编写库代码以支持ARC和MRR,objective-c,memory-management,automatic-ref-counting,Objective C,Memory Management,Automatic Ref Counting,我正在开发一个库,我希望在一个代码库中支持ARC和MRR两种内存管理方法 我不想强迫用户为我的代码使用特殊标志——fobjc arc 我知道预处理器测试:如果_有featureobjc_arc,那么使用它来覆盖所有差异的最佳实践是什么 有没有人有过这方面的经验,可以使它干净、易于使用 更好的方法是使用一些宏在圆弧和非圆弧之间进行转换,我可以在代码中使用这些宏 ========= 我的问题用公认的答案解决了,但作为对其他人的提示,我发现为如何处理我的问题提供了最好的示例集。支持ARC和非ARC代码

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

我不想强迫用户为我的代码使用特殊标志——fobjc arc

我知道预处理器测试:如果_有featureobjc_arc,那么使用它来覆盖所有差异的最佳实践是什么

有没有人有过这方面的经验,可以使它干净、易于使用

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

=========


我的问题用公认的答案解决了,但作为对其他人的提示,我发现为如何处理我的问题提供了最好的示例集。

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


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

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

#if !__has_feature(objc_arc)
  #error ARC must be enabled!
#endif
或者在启用ARC的情况下构建为lib/framework。在预处理器指令中包装内存管理代码是一个糟糕的想法

请参阅github中的代码。我想,这就是你想要的

#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]);

是的,别这样。对于每次更改,您将不得不对代码进行两次完整的测试。并对所有内容进行两次调试。这不值得努力

您真的很想编写纯圆弧或纯非圆弧的代码


头文件中出现的结构很少在其中一个文件中不起作用。

您打算如何分发库?如果你只是想发布一个.framework或静态库,那没关系,只要用ARC开发它,没有ARC的人就可以使用它。对于几个项目,它将是更多的公司库,有些是ARC,有些不是。为简单起见,我想将其作为代码而不是.framework分发,但如果make.framework解决了一个问题,也许我会这样做注意,您可以添加-fobjc arc或-fobjc no arc标志,以逐个文件启用/禁用arc。因此,在同一个项目中混合使用ARC和非ARC代码相当容易。请参阅:我知道-正如在一个问题中所写的那样,我希望避免这样做,并将处理这两个选项的责任放在我自己的代码上:这应该回答您的问题我知道这一个问题,正如我的问题中所描述的那样-我不想要这种方法:如问题中所描述的那样-我更喜欢同时生成支持这两个选项的代码-而不是使用此标志。但谢谢你。@Suresh链接到MBProgressHUD,后者就是这样做的。我还发现很少有库能够正确地处理这个问题。对我来说,编写一个适用于所有环境的代码是非常有意义的:好吧,这听起来很合理。我必须为转换定义一个集合,但是我应该处理的是:我希望能有一个列表来显示这些集合;]无论如何,这是我想做的最接近的答案。谢谢。这似乎没有考虑到[super dealoc],当ARC被禁用时,它必须在-dealoc覆盖中调用,而当ARC被启用时,它是非法的。再说一次,这是个坏主意。。。