ios - 创建104634个节点的链表时测试崩溃

标签 ios swift data-structures

我注意到一个有趣的行为。我一直在测试构建包含许多元素的链表的性能。由于某种原因,经过一定数量的释放后,测试会崩溃。

这是我的 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 调用塔:

debug screenshot

另一件有趣的事情是,如果将列表移到测试函数之外,它不再崩溃:

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

最佳答案

我无法编译你的测试。 enter image description here

此代码适用于 100 倍的节点。我不认为 self 引用是你的问题,但它确实表明你正在使用旧的 Swift 版本。升级您的工具并重试。 enter image description here

关于ios - 创建104634个节点的链表时测试崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42910995/

相关文章:

ios - UITableview 在重新加载时滚动到顶部太高了吗?

objective-c - Swift:在 didSet 中通知委托(delegate)?

成对的 C++ vector

ios - Swift - ReloadData 不调用 CellForRowatIndexPath

swift - 二元运算符 '==' 不能应用于两个操作数

algorithm - RRB 树保持什么不变性?

algorithm - 找出使总和最小的排列

ios - 同时将数据写入和读取到NSMutableArray

ios - 实时跟踪多个 iPhone GPS 位置

ios - 将数组附加到多维数组