我在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.有谁知道它是什么?
谢谢你的帮助.
我刚刚遇到了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)
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |