3

我制作了一个使用ARC编码的静态库。我计划将这个库分发给其他人使用。我知道在非ARC项目中不需要做ARC静态库,但包含ARC头文件又怎么样?例如,我的ARC静态库的头文件声明属性为weakstrong,但是当我尝试将这些头文件包含在非ARC项目中时,编译器就吓倒了。在非ARC项目中包含ARC标题

任何想法?

+0

如果我没有错,这是不能做到的。您可以禁用ARC项目中的某些文件,但不是相反......我认为您应该考虑将您的项目迁移到ARC。这个问题可能有所帮助:http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk – bontoJR 2012-03-06 15:47:59

+1

你可以通过传递'-fobjc-arc '。但是这个问题涉及到一个预编译的静态库。我假设整个图书馆将用ARC构建。 – 2012-03-06 16:02:04

+0

是的,整个图书馆都是用ARC构建的。 – edc1591 2012-03-06 23:58:09

回答

3

对于strong,您可以使用retain。它们是相同的。

weak更棘手,虽然我知道应该工作的几种方式,但我不确定处理它的最佳方式。

首先,确保你确实需要它。如果你支持iOS4,那么你不能有weak,所以这个问题是没有意义的。我的直觉是,我可能会避免weak,并使所有这些问题消失。弱点很好,但在大多数情况下,这并不是什么大事。

也就是说,有一些方法可行。最好的可能是在头文件中声明weak没有属性的访问器。取而代之的是:

@property (nonatomic, readwrite, weak) id delegate; 

这样做:

- (id)delegate; 
- (void)setDelegate:(id)aDelegate; 

,那么你仍然可以宣布你的实现文件里面weak属性。调用者仍然可以为此使用点符号,顺便说一句。

这里可能会出现编译错误,因为setDelegate:在技术上需要__strong id。如果是这样的话,只需手工执行setDelegate:

- (void)setDelegate:(id)aDelegate { 
    _delegate = aDelegate; 
} 

没有测试过,但应该有效。您也可以在@implementation区块中宣布伊瓦尔_delegate__weak,而不是声明它为weak属性。

就像我说的;我还没有测试过这些。如果它发挥作用,请发表你的发现。

+0

如果它是一个已编译的静态库,那么您可以简单地更改导入到应用程序中的头,因为头对静态库中编译的实现没有影响。 – 2012-03-06 18:22:44

+0

非常有趣的一点。有点可怕,但可能有效。我并不知道可以使用这种预处理器宏,但这会使这种方法更简单。 – 2012-03-06 18:31:36

+0

这可能是一种可能性。有没有反对这样做的争论,还是会相当安全? – edc1591 2012-03-06 23:59:30