我注意到一个有趣的行为。我一直在测试构建包含许多元素的链表的性能。由于某种原因,经过一定数量的释放后,测试会崩溃。
这是我的 LinkedList 实现:
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
库对此进行测试。我做了这个测试功能:
let number = 104633
func testPerformanceExample() {
self.measure {
var list = LinkedList<Int>(data: 5)
for i in 0..<number {
list = list.cons(i)
}
}
}
我花了相当多的时间试图弄清楚这个数字。看来,如果我尝试构造一个具有 104634 节点的 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)
}
}
}
我很好奇为什么一长串的释放会导致崩溃。提前致谢!
编辑:
当您在 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)
}
}
最佳答案
关于ios - 创建104634个节点的链表时测试崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42910995/