我制作了一个使用ARC编码的静态库。我计划将这个库分发给其他人使用。我知道在非ARC项目中不需要做ARC静态库,但包含ARC头文件又怎么样?例如,我的ARC静态库的头文件声明属性为weak
和strong
,但是当我尝试将这些头文件包含在非ARC项目中时,编译器就吓倒了。在非ARC项目中包含ARC标题
任何想法?
我制作了一个使用ARC编码的静态库。我计划将这个库分发给其他人使用。我知道在非ARC项目中不需要做ARC静态库,但包含ARC头文件又怎么样?例如,我的ARC静态库的头文件声明属性为weak
和strong
,但是当我尝试将这些头文件包含在非ARC项目中时,编译器就吓倒了。在非ARC项目中包含ARC标题
任何想法?
对于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
属性。
就像我说的;我还没有测试过这些。如果它发挥作用,请发表你的发现。
如果它是一个已编译的静态库,那么您可以简单地更改导入到应用程序中的头,因为头对静态库中编译的实现没有影响。 – 2012-03-06 18:22:44
非常有趣的一点。有点可怕,但可能有效。我并不知道可以使用这种预处理器宏,但这会使这种方法更简单。 – 2012-03-06 18:31:36
这可能是一种可能性。有没有反对这样做的争论,还是会相当安全? – edc1591 2012-03-06 23:59:30
如果我没有错,这是不能做到的。您可以禁用ARC项目中的某些文件,但不是相反......我认为您应该考虑将您的项目迁移到ARC。这个问题可能有所帮助:http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk – bontoJR 2012-03-06 15:47:59
你可以通过传递'-fobjc-arc '。但是这个问题涉及到一个预编译的静态库。我假设整个图书馆将用ARC构建。 – 2012-03-06 16:02:04
是的,整个图书馆都是用ARC构建的。 – edc1591 2012-03-06 23:58:09