在这种情况下,Xcode 调试内存图和 Instruments 都无法检测到泄漏?

问题描述

我做了一个小实验:有 2 个视图控制器: 在第一个(根视图控制器)中,我将此代码用于呈现第二个视图控制器:

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)

  present(ViewController2(),animated: true) {
   self.dismiss(animated: true,completion: nil)
  }
}

这是ViewController2里面的代码

class ViewController2: UIViewController {
  var workItem: dispatchWorkItem?
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    workItem = dispatchWorkItem {
      self.view.backgroundColor = .red
    }
  }
  
  deinit {
    print("deinit called")
  }
}

因为在视图控制器 2 中,self 持有对 workItem 的强引用,而 workItem 持有对 self 的强引用,这里应该存在内存泄漏:view控制器 2 在我们完成呈现后不会被释放(证明行 deinit called 没有打印,如果我评论这个语句 self.view.backgroundColor = .red,它打印出来:deinit called

但是当我尝试使用 Xcode memory graph debug 和后来的 Instrument 来验证此泄漏时,他们都告诉我这里没有泄漏。

我错过了什么吗?

谢谢大家,祝你有美好的一天!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)