gpt4 book ai didi

ios - Swift 2.1 错误排序到位,仅在发布版本上

转载 作者:搜寻专家 更新时间:2023-11-01 05:38:44 25 4
gpt4 key购买 nike

我开始在下面的代码中获取排序 lamdba 的崩溃报告,下面灰色框中的第三行:

private func fixOverlaps(inout blocks: [TimeBlock], maxOverlaps: Int? = nil) {
blocks.sortInPlace { a,b in
if a.startTime < b.startTime {
return true
} else if a.startTime == b.startTime && a.endTime < b.endTime {
return true
}
return false
}
...

请注意,从 XCode 调试构建时不会发生崩溃。只有 App Store 和 Ad Hoc 存档会崩溃,并且只有在阻止列表的长度为数百时才会崩溃。

我修改了代码,问题消失了:

private func fixOverlaps(inout blocks: [TimeBlock], maxOverlaps: Int? = nil) {
blocks = blocks.sort { a,b in
if a.startTime < b.startTime {
return true
} else if a.startTime == b.startTime && a.endTime < b.endTime {
return true
}
return false
}
...

关于如何使用 inout 或 sortInPlace,我是否遗漏了什么?我可以尝试做一个演示。它适用于多个版本的 iOS (8/9) 和 Swift 2.1。

编辑--------------------

好的,这是一个会崩溃的最小版本。原来 inout 是一条红鲱鱼。如果你在 XCode 7.1 中开始一个新的单 View 项目,你可以用这个替换 View Controller :

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

var blocks = [TimeBlock]()
for var i in 0...20 { //Works if you put in a small number like 8
let t = TimeBlock()
t.start = Int(arc4random_uniform(1000)) //Get some random numbers so the sort has to do some work
t.end = Int(arc4random_uniform(1000))
blocks.append(t)
}

blocks.sortInPlace { a,b in
if a.start > b.start {
return true
}
return false
}

print("done") //Gets here on debug, not release
}

class TimeBlock {
var start = 0
var end = 0
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}


}

因此,在发布版中运行它,如果您在 17 点左右结束循环但在 20 点时崩溃,您应该会看到它打印“完成”。确切的数字可能与您不同。

最佳答案

通过使用 self.list = self.list.sort() 而不是 self.list.sortInPlace() 在不损失功能的情况下解决了这个问题。

关于ios - Swift 2.1 错误排序到位,仅在发布版本上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33584294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com