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

我开始在下面的代码中找到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.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...