2015-10-30 11 views
10

を構築し、私は、下の灰色のボックスの3行目を以下のコードでソートlamdbaのためのクラッシュレポートを取得開始しました:クラッシュが発生していないスウィフト2.1エラーは、唯一のリリースに

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の複数のバージョンにあります。

EDITは--------------------

[OK]を、ここでクラッシュし、最小限のバージョンです。イントゥーは赤ちゃんだった。だから、リリースでそれを実行して、あなたはあなたの周りにループを終了した場合、それが「完了」のプリントを参照する必要があり

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. 
} 


} 

:あなたはXCodeの7.1の新しい単一のビューのプロジェクトを開始した場合は、これでビューコントローラを交換することができます17が、20でクラッシュします。正確な数はあなたのために異なるかもしれません。

+1

確かにアップルに報告する人:https://bugreport.apple.com –

+0

コアの質問とは無関係のサンプルコードクリーンアップ: '>'はあなたに '>'を与えるので、あなたの 'sortInPlace'の' if'は不要です。ブール値。あなたは '{a、b in a.start> b.start}'と書くことができます。 '$ 0'を使うと暗黙的に返されるので、簡単に' $ $ start $ 1start ''を実行することもできます。 –

+0

@PaulCantrell終了時刻はどうですか?それは自分自身をきれいにしますか? – Carlos

答えて

3

このコードは正しいようです。コンパイラのバグにぶつかるように聞こえるようですが、これは一般的にはリリース構成にクラッシュがありデバッグはしていない場合です。これは、デバッグビルドの最適化を有効にし、問題が発生していないかどうかをテストすることで確認できます。回避策以外に、唯一必要なことはfile a bugです。

+0

私は貼り付けますこれを数分でデモします。私は新しいプロジェクトでそれを再現しました。 – Carlos

+0

そこに行って、テストをしてください。 – Carlos

4

これはXcode 7.1のバグです。速いコンパイラの最適化レベルを速くから無しに変えて、この問題を解決しました。

6

self.list.sortInPlace()の代わりにself.list = self.list.sort()を使用して、この機能を損なわずに作業しました。

3

これまでのところ、bug on bugs.swift.orgがログに記録され、Xcode 7.1で実際に問題が発生していることを、開発者の一人から迅速な対応で受け取りました。彼は、その解像度がXcode 7.2 Release Notesに概説されていることを指摘した:

オプティマイザのバグがクラッシュする可変コレクションにソートインプレースで不具合が修正されました。 (23081349)

Xcode 7.2を使用してコンパイルすると、この問題も解決するはずです。

+1

素晴らしい。これは役に立ちました。狂っていた。 – Carlos