【发布时间】:2013-02-13 13:27:42
【问题描述】:
我正在制作一个静态 iOS 框架。我想使用第 3 方代码,让我们在我的框架中使用 AFNetworking 作为示例。 AFNetworking 很受欢迎。我现在可以感觉到命名空间冲突。这里的最佳做法是什么?据我了解,我有 3 个选项:
1) 将AFNetworking 构建到我的框架中,导出标题。这让客户可以在我的库中使用AFNetworking 的版本,但他们不能使用也链接AFNetworking 的其他框架。如果他们建立在 AFNetworking 的基础上,他们会依靠我来更新它。
2) 针对AFNetworking 标头的代码,但让第三方在他们的项目中包含AFNetworking。这为框架消费者增加了一个额外的步骤,他们必须添加AFNetworking 源。将来可能会出现版本不兼容,但至少如果另一个框架使用AFNetworking,他们可以同时使用它。
3) 重新命名空间 AFNetworking 并保持标题私有。通过这种方式,我以任何方式避免了命名空间冲突,但更新我的AFNetworking 副本变得非常困难。最终的二进制文件变得有点大,但所有的互操作性问题都得到了解决。这对我来说还有很多工作。
我还有其他选择吗?最佳实践是什么?
【问题讨论】:
-
我不明白为什么会有命名空间冲突(除非你在你的类前面加上
AF)。使用 AFNetworking 的最新稳定版本,但让用户包含它。如果您使用的 API 是公开的,则不太可能更改。 -
你检查过cocoapods吗?您可以将依赖项添加到其他 pod。
-
@H2CO3 如果编译的
AFNetworking对象包含在我的库二进制文件中,并且用户自己添加代码或使用包含它的其他框架,则当链接器尝试时,objective-c 中将发生命名空间冲突制作最终的应用程序二进制文件。 -
@jackslash 但这就是我要说的 - 你确实不包含库的二进制文件。也不是标题。您要求用户这样做。
-
我会选择选项 2)。就个人而言,如果我下载一个依赖于另一个库的库,这没什么大不了的,实际上只需单击几下即可包含它。但是,请确保您的框架的描述文件以粗体显示警告,告诉我我将 nedd AFNetworking。还要确保如果我尝试在没有 AFNetworking 的情况下使用您的库,则会出现 真的 明确错误,告诉我我没有包含此库。我真的认为,只要您图书馆的用户消息灵通,就可以了。老实说,它会为你节省很多时间来改进你自己的库;)
标签: ios objective-c frameworks linker