我开始在下面的代码中找到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.
编辑 – – – – – – – – – –
好的,这是一个崩溃的最小版本.原来,这是一个红色的鲱鱼.如果您在XCode 7.1中启动新的单视图项目,则可以使用以下命令替换视图控制器:
- 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完全数字可能会有所不同.
解决方法
这段代码看起来是正确的.这听起来像是在编译器中遇到了一个错误,通常情况是在发布配置崩溃但不调试时.您可以通过在调试构建和测试中进行优化来查看是否生成问题来验证.除了您的解决方法外,您唯一需要做的其他事情是
file a bug.