【问题标题】:Objective-C — different versions of the same library results in name collisionsObjective-C — 同一个库的不同版本会导致名称冲突
【发布时间】:2012-03-01 16:04:35
【问题描述】:

我读过 Objective-C 的性质很容易导致名称冲突,因此在代码中添加前缀是最佳实践。

如果您的MyAwesomeApp iOS 应用程序使用两个外部库FooLibraryBarLibrary 导致名称冲突,您如何解决此问题,因为在内部FooLibrary 也碰巧使用BarLibrary

起初可能会建议删除对BarLibrary 的任何一个引用,但你不能这样做,因为虽然两者都是BarLibrary,但它们实际上是它的两个不同版本,所以FooLibrary 取决于在BarLibrary(v1) 实现上,而您的MyAwesomeApp 取决于BarLibrary(v2) 实现。

此时我意识到同一个库的两个不同版本实际上是两个不同的东西,所以它们不应该首先共存于同一个项目中。

除了重构(通过重命名)其他人的代码之外,还有其他方法可以解决这个难题吗?

【问题讨论】:

  • 你能改用v1 of BarLibrary吗?
  • 我认为唯一好的解决方案是让FooLibrary的作者更新到BarLibrary的v2。由于 Apple 不支持 iOS 上的共享库,这只是我们必须忍受的限制之一。
  • @Mike 的意思是你不能那样做?
  • @exalted,除非您有办法编辑二进制文件以在编译后更改符号名称。也许某种混淆工具可以做到这一点。或者,您可以使用十六进制编辑器,在 BarLibrary v1 及其在 FooLibrary 中的调用者中搜索和替换有问题的符号,并使用一些备用名称。如果你这样做,一定要好好测试它。 ;-)
  • @exalted,你有 FooLibrary 和 BarLibrary v1 的源代码吗?你也可以#define 函数名在它们的头文件中添加其他内容...

标签: objective-c ios xcode namespaces compiler-errors


【解决方案1】:

如果其他库正在使用可能共享的库,例如一个 JSON 库,并且他们正在编译一个库供您包含,那么他们应该在库中添加自己的前缀。

例如,我曾在 Urban Airship 上看到过这种方式。他们使用 JSONKit(或一些 JSON 库),但他们在所有 JSONKit 用法的前面加上 UA - 所以当我使用不同版本的 JSONKit 时,它们可以一起编译和运行。

我也看到它是用可达性完成的……每个人似乎都有自己的版本……

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 2019-12-22
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2012-01-12
    相关资源
    最近更新 更多