【问题标题】:Including ARC headers in non-ARC project在非 ARC 项目中包含 ARC 标头
【发布时间】:2012-03-06 15:42:37
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 如果我没记错的话,这个是做不到的。您可以为 ARC 项目中的某些文件禁用 ARC,但不能相反...我认为您应该考虑将项目迁移到 ARC。这个问题可能会有所帮助:stackoverflow.com/questions/6368600/…
  • 您可以通过 -fobjc-arc 为单个文件打开 ARC。但问题与预编译的静态库有关。我假设整个库都将使用 ARC 构建。
  • 是的,整个库都是用 ARC 构建的。
  • @JuniorB。 - 您确实可以在非 ARC 应用程序中使用启用 ARC 的框架(我现在为我的一个开源框架这样做)。除了标头兼容性之外,您需要注意的唯一另一件事是,如果您部署到 Snow Leopard 或 iOS 4.x,您需要将 -fobjc-arc 添加到您的应用程序的其他链接器标志中,以便获得必要的 libarclite被链接进来。

标签: objective-c ios cocoa-touch static-libraries automatic-ref-counting


【解决方案1】:

对于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 块中将 ivar _delegate 声明为 __weak,而不是将其声明为 weak 属性。

就像我说的;我还没有测试过这些。如果可行,请发布您的发现。

【讨论】:

  • 如果它是一个已经编译好的静态库,那么您可以简单地更改导入到应用程序中的头文件,因为该头文件对静态库中编译的实现没有影响。
  • 非常有趣的一点。有点可怕,但可能有效。我不知道您可以为此使用预处理器宏,但这会使这种方法更简单。
  • 有可能。是否有任何反对这样做的论据,或者它是否非常安全?
  • 为不同的读者修改签名让我害怕。我以前被它严重烧伤过。但我真的想不出在这种情况下它会爆炸的任何原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多