swift - `outlined init with copy of protocol` 是什么意思?

标签 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()
        }
    }
}

(顺便说一句,Arraygenerate 方法只是创建一个随机 Ints 数组)

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

results from Instruments

如您所见,几乎一半的时间都在调用名为 outlined init with MultiplyByTwoProtocol 的副本 的条目。有人知道这是什么吗?

感谢您的帮助。

最佳答案

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

在我的例子中,导致问题的代码行是访问 for 循环内的静态常量。在循环之前将相同的静态常量分配给 nothing 修复了崩溃,如本例所示:

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

关于swift - `outlined init with copy of protocol` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52734074/

相关文章:

ios - PromiseKit 6.0 将捕捉到的错误传递给调用者

ios - 视频播放GPUImage和swift

cocoa - 例如如何TextWrangler 在 finder 中生成预览?

ios - 从函数返回不同类型的数组内容

ios - Swift - 在 UIImageview 上设置可点击区域

ios - 在谷歌地图中设置多个标记

ios - 如何将 UIPickerView 中的第一个条目设为空白

ios - 在变量中调用 URL 以接收图像

swift - Firebase Swift 查询在查询性能中的作用

ios - 如何从新的 Firebase 存储下载和查看图像?