私は面白い動作に気付いています。私は多くの要素を持つリンクされたリストを構築するパフォーマンスをテストしてきました。何らかの理由で、一定量の割り当てを解除した後、クラッシュによるテスト。104634個のノードを持つリンクリストを作成すると、テストがクラッシュする
class LinkedList<T> {
let data: T
var next: LinkedList?
init(data: T, next: LinkedList? = nil) {
self.data = data
self.next = next
}
func cons(_ data: T) -> LinkedList {
return LinkedList(data: data, next: self)
}
}
私はXCTest
ライブラリを使用して、これをテストしてい:
は、ここに私のLinkedListの実装です。私はこのテスト機能を作った:
let number = 104633
func testPerformanceExample() {
self.measure {
var list = LinkedList<Int>(data: 5)
for i in 0..<number {
list = list.cons(i)
}
}
}
私はかなりの時間をかけてこの数字を調べた。それは私がノードとのLinkedListを構築しようとした場合、私はThread 1: EXC_BAD_ACCESS (code=2, address=0x7fff5a059ff8)
クラッシュを取得しているようですし、デバッグナビゲーターはLinkedList.deinit
通話の塔を示しています
もう一つ興味深いのは、あなたが移動した場合ということですリストには、テスト関数の外に、それがクラッシュしなくなりました:
var list = LinkedList<Int>(data: 5)
func testPerformanceExample() {
self.measure {
for i in 0..<self.number {
self.list = self.list.cons(i)
}
}
}
私は好奇心へと割り当て解除の長いシリーズは、クラッシュを引き起こすことができる理由。前もって感謝します!
EDIT:あなたはXCTestCase
の外でコードを実行したときに
このクラッシュが発生します。 UIViewController
にこのコードがあります。
class ViewController: UIViewController {
let number = 1046340
override func viewDidLoad() {
super.viewDidLoad()
let date = Date()
var list = LinkedList<Int>(data: 0, next: nil)
for i in 0..<number {
list = list.cons(i)
}
let timeInterval = Date().timeIntervalSince(date)
print(timeInterval)
}
}
ありがとう、これは興味深いです。私はあなたのように 'print'ステートメントを追加し、ブレークポイントを追加しました。ブレークポイントは正常にトリガーされました。テスト終了後にクラッシュが発生したようです。 あなたの番号を '1046340'に微調整してテストを実行するのが速いので、ブレークポイントを削除してください。 ツールについては、最新のものを使用していると思います。私はXcodeバージョン8.2.1(8C1002)を使用しています。あなたが '自己参照 'によって何を意味するか分からない。 –
あなたはデニットと何かをしていると思います。私は、XCTestCaseが成功/失敗を決定するためのメソッドの最後に何か夢中になっているかどうかと、膨大な量の割り当て解除が何かを混乱させているのだろうかと思います。リストのデータプロパティを弱くすると(機能が破損しますが...)、問題が発生しないことがわかります。また、割り当て解除は、ループの最中にすべてではなくループ内で実行されます関数スコープ。 –
@AndrewCarterこれは 'XCTestCase'だけではなく、View Controllerの' viewDidLoad'メソッドでこれを試みました。私はアプリを走らせて、アプリをクラッシュさせた。 –