【问题标题】:Class MyClaseName is implemented in both A.Framework and B.FrameworkMyClaseName 类在 A.Framework 和 B.Framework 中都实现了
【发布时间】:2015-04-29 00:05:12
【问题描述】:

我有使用框架 A 和 B 的 iOS 应用程序。每个都需要 MyClaseName 类。

运行应用程序后,我在日志中有以下警告:

objc[2472]: MyClaseName 类在两者中都实现 /Users/myusername/Library/Developer/Xcode/DerivedData/workspace-amvqjwzykbswydebvpvdfbylgsck/Build/Products/Debug-iphonesimulator/A.framework/A 和 /Users/myusername/Library/Developer/Xcode/DerivedData/workspace-amvqjwzykbswydebvpvdfbylgsck/Build/Products/Debug-iphonesimulator/B.framework/B. 将使用两者之一。哪一个是未定义的。

我检查过类似的SO question,但不幸的是这不是我的情况。

那么,我该如何解决这个问题?

【问题讨论】:

  • 我认为您可能需要重命名其中一个。
  • 你应该重命名它们,在创建类时使用某种前缀非常重要。通常我使用我的初始 AF 和项目或框架的名称,例如 AFPhotogunViewController
  • @Yuchen,这个类的实例需要是整个项目的实例。在重命名的情况下,我会有不同的实例。
  • @IAmDav,这听起来很像C++ 中的钻石继承 问题。不一样,但类似的想法。不确定您的问题是否真的有解决方案。也许你仍然需要重构你的代码结构。
  • 嗨@Yuchen,实际上问题来自iOS框架。我的 C++ 类加载了两次。我认为这个 Xcode 需要引入新的选项,以避免这种情况。

标签: c++ ios linker ios-frameworks


【解决方案1】:

这就是为代码中的所有类添加指定前缀的原因。

A.framework 的类应该以AF 为前缀,B.framework 应该使用BF,例如:

AFClassName *aInstance = [AFClassName new];
BFClassName *bInstance = [BFClassName new];

如果没有前缀,这两个类实际上都称为“ClassName”,并会导致您看到的那种冲突。

【讨论】:

  • 你建议怎么做?为所有文件编写脚本以重命名它们?我希望有一些链接器选项可以让应用理解这是同一个对象/类?
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 2022-07-19
  • 1970-01-01
  • 2021-12-06
  • 2016-07-23
  • 2016-08-05
  • 2021-03-13
  • 1970-01-01
相关资源
最近更新 更多