我用 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()
}
}
}
(顺便说一句,Array
的 generate
方法只是创建一个随机 Ints
数组)
然后,我在 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/