【问题标题】:Two frameworks with the same symbol具有相同符号的两个框架
【发布时间】:2012-01-11 22:03:13
【问题描述】:

我的 Xcode 项目中有两个框架,它们都定义了一个同名的类(B.framework 和 C.framework 都有一个名为 MyClass 的类),导致出现如下警告:

Duplicate symbol _OBJC_METACLASS_$_MyClass originally in B.framework/B(MyClass.o) now lazily loaded from C.framework/C(MyClass.o)
Duplicate symbol _OBJC_CLASS_$_MyClass originally in B.framework/B(MyClass.o) now lazily loaded from C.framework/C(MyClass.o)

然后在运行时只加载一个实现,而尝试使用另一个将导致“无法识别的选择器发送到实例”,因为它们是完全不同的类(即使它们具有相同的名称)。

我直接在我的代码中使用其中一个 MyClass 实现,但另一个框架只在内部使用它的 MyClass 我不知道为什么它甚至导出(它甚至没有在框架头文件中提到,我使用nm 来查看符号)。

我怎样才能使这两个框架都工作?

【问题讨论】:

    标签: objective-c ios xcode frameworks duplicates


    【解决方案1】:

    Obj-C 中没有“导出”类这样的东西。或者更确切地说,没有“非导出”类这样的东西。这个问题正是为什么强烈建议所有 Obj-C 代码在类上使用 2 或 3 字母前缀的原因。您唯一的解决方案(除了不使用这些框架)是编辑一个(或两个)框架以更改类名,或者如果您无权访问源代码,那么您需要联系供应商并要求他们做出改变。

    【讨论】:

    • 这就是我所担心的。我无权访问任何一个框架源,否则我会按照您所说的方式修复它。在希望供应商为我修复它之前,一位朋友提出了一个听起来似乎合理的解决方案(尽管它确实感觉有点 hacky):创建我自己的两个框架,每个框架都链接到他们的一个框架,然后将我的子类化需要适当的前缀。知道这是否可行,或者它们框架中的符号是否仍会通过封装框架“导出”? Gunna 尽快测试
    • 请记住,Obj-C 是一种动态运行时语言。任何链接的对象文件/框架添加到运行时的任何内容都将暴露给整个应用程序。
    • 是的,我意识到,因为我要开始工作了 :( 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多