`概述init与协议副本'是什么意思?

Wie*_*rny 5 swift

我在Swift中编写了非常简单的代码:

protocol MultiplyByTwoProtocol {
    func multiply() -> Int
}

class MultiplyByTwoClass: MultiplyByTwoProtocol {
    private let n: Int

    init(n: Int) { self.n = n }

    func multiply() -> Int { return 2 * n }
}

class DynamicDispatchSwift {

    private let items: [MultiplyByTwoProtocol]

    init(n: Int) {
        self.items = Array<Int>.generate(size: n).map(MultiplyByTwoClass.init)
    }

    func run() {
        items.forEach { input in
            _ = input.multiply()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(btw generate方法Array只是创建一个随机数组Ints)

然后,我在Instruments中运行该代码,得到以下结果:

仪器的结果

正如您所看到的,几乎有一半的时间需要进入outlined init with copy of MultiplyByTwoProtocol.有谁知道它是什么?

谢谢你的帮助.

Cha*_* A. 4

我刚刚遇到了outlined init with copy of ...来自使用发布配置构建的应用程序崩溃的堆栈跟踪顶部。我发现关闭编译器优化设置可以防止崩溃。最终,我还找到了堆栈跟踪指向的代码的等效语法,优化器遇到问题,不会导致崩溃并且能够重新打开优化。

就我而言,导致问题的代码行是访问 for 循环内的静态常量。在循环之前将相同的静态常量赋值为空可以修复崩溃,如下例所示:

let _ = Foo.fooConstant // This line fixed the crash
for index in 0..<values.count {
    let someBar = Bar(foo: .fooConstant)
    ...
}
Run Code Online (Sandbox Code Playgroud)