【问题标题】:@_dynamicReplacement(for: ) error in simulator模拟器中的@_dynamicReplacement(for:) 错误
【发布时间】:2020-04-02 07:29:18
【问题描述】:

我使用 CocoaPods 来管理我的私有组件。现在我有一个组件Test。其中一个类的声明如下:

open class Test {

    open dynamic func test() {
        print("test")
    }
}

我对这个组件没有任何问题,它已经在我的私人仓库中

现在我有另一个名为Test2 的组件。我想用Test2中的@_dynamicReplacement(for:)来交换Test中的test()方法如下:

public extension Test {

    @_dynamicReplacement(for: test())
    public func test2() {
        print("test2")
    }
}

现在我想把 Test2 打包成一个 pod 组件,比如 Test。

但是当我执行pod spec lint时,却报错:

<unknown>:0: error: fatal error encountered during compilation; please file a bug report with your project and the crash log
<unknown>:0: note: unsupported relocation with subtraction expression, symbol '_$s9MBCRouter6RouterC23MBCNavigationController0cdB010NavigationORszrlE15navigationTest2yyF' can not be undefined in a subtraction expression

我发现这个问题只出现在x86_64i386上。

我尝试创建一个同时集成TestTest2 的项目。

当我在真机上运行它时,它运行良好。但是当我在模拟器上运行时,却报错了!

当我将上面的第二段代码放在测试组件中时,它没有任何问题。

所以我认为重现这个bug需要以下两个条件:

  1. pod B 中,使用 @_dynamicReplacement(for:) 交换其他 pod 组件中的方法
  2. 在模拟器中运行项目

我发现了这个问题,但我无法解决,谁能帮忙解决这个问题?非常感谢!


最后我想说说我的开发环境

  1. 我使用 CocoaPods 1.9.1、Xcode 11.4 和 Swift 5.2。
  2. podfile 中仅使用use_frameworks!
  3. TestTest2 .podspec 文件集 static_framework = true

【问题讨论】:

    标签: ios swift cocoapods


    【解决方案1】:

    要为模拟器构建,您需要在函数声明中添加 @objc 属性,例如:

    open class Test {
    
        open @objc dynamic func test() {
            print("test")
        }
    }
    

    更新:更常见的解决方案(包括泛型) - 在 Build Settings 中将 Compilation Mode 设置为 Incremental,在这种情况下,您无需使用 @objc at一切为了模拟器。

    【讨论】:

    • 谢谢!它是有益的!但是很遗憾,它不能应用于具有泛型的类,所以很遗憾
    • 有什么方法可以让类泛型在模拟器下也使用@_dynamicReplacement?例如class Test &lt;T: Codable&gt;
    • 我找到了解决方案:您应该在 Build Settings 中将 Compilation Mode 设置为 Incremental 以使用 @_dynamicReplacement 为 Simulator 编译泛型。跨度>
    • 添加@objc后,无法使用-Xfrontend -enable-dynamic-replacement-chaining对同一个方法进行多次替换操作。只有一种方法会生效。当我删除@objc时,所有方法都会被执行...
    • 对于增量模式,你根本不需要使用@objc
    猜你喜欢
    • 2020-04-25
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多