将ARC头文件包含在非ARC项目中

3
我制作了一个使用ARC编码的静态库。我计划将此库分发给其他人使用。我知道在非ARC项目中包含ARC静态库不需要做任何事情,但是如果要包含ARC头文件呢?例如,我的ARC静态库的头文件声明属性为 weak strong ,但当我尝试在非ARC项目中包含这些头文件时,编译器会出错。
有什么想法吗?

如果我没错的话,这是不可能做到的。你可以在 ARC 项目中禁用某些文件的 ARC,但反过来不行... 我认为你应该考虑将你的项目迁移到 ARC。这个问题可能会有所帮助:https://dev59.com/12w15IYBdhLWcg3w1vOB - bontoJR
1
您可以通过传递“-fobjc-arc”来为单个文件打开ARC。但问题涉及到预编译的静态库。我假设整个库将使用ARC构建。 - Rob Napier
是的,整个库都使用ARC构建。 - edc1591
1
@JuniorB. - 你确实可以在非ARC应用程序中使用启用ARC的框架(我现在就为我的一个开源框架这样做)。除了头文件兼容性之外,你需要注意的另一件事是,如果你部署到Snow Leopard或iOS 4.x,你需要为你的应用程序添加“-fobjc-arc”到你的其他链接器标志,以便必要的libarclite被链接进去。 - Brad Larson
1个回答

3
对于strong,你可以使用retain。它们是相同的。 weak更加棘手,虽然我知道几种方法可以解决,但我不确定最好的处理方式。
首先,请确保您确实需要它。如果您支持iOS4,则无论如何都不能使用weak,所以问题已经不存在了。我的直觉是,我可能会避免使用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块中将ivar _delegate声明为__weak,而不是将其声明为weak属性。

就像我说的那样;我没有测试过任何内容。如果它有效,请发布您的发现。


如果它是一个已经编译的静态库,那么你可以简单地更改导入到应用程序中的头文件,因为该头文件对于在静态库中编译的实现没有影响。 - Richard J. Ross III
非常有趣的观点。稍微有些可怕,但可能是有效的。我不知道是否有预处理宏可以用于此,但这会使这种方法更简单。 - Rob Napier
那可能是一种可能性。有反对这样做的论据吗,还是这样做相当安全? - edc1591
修改不同读者的签名让我感到害怕。我以前曾经因此严重受挫。但是我真的想不出在这种情况下它会爆炸的任何理由。 - Rob Napier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接