iOS内存泄漏,内存图调试器未显示泄漏,但并行Xcode-Instruments-leaks显示泄漏

时间:2020-07-03 13:02:43

标签: ios swift memory-leaks xcode-instruments memory-graph-debugger

enter image description here在我的项目中当我开始在内存图调试器中查找泄漏时,发现的泄漏很少并进行了修复,现在使用内存图没有发现泄漏。仪器->泄漏的问题,有时显示泄漏,有时不显示泄漏,如照片中所述,泄漏从一开始就立即出现,我几乎不了解是什么原因导致泄漏。如果内存图显示没有泄漏,我可以相信吗?或有一种泄漏未被内存图捕获。代码如何初始化mainViewController:

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow()
    
    let controller = MainViewController()
    let navigationController = UINavigationController(rootViewController: controller)
    let rootViewController = navigationController
    self.window?.rootViewController = rootViewController
    self.window?.makeKeyAndVisible()
           
    return true
        
}

1 个答案:

答案 0 :(得分:6)

观看这段古老的视频Fixing Memory Issues,它向我们介绍了“泄漏”,“废弃的内存”和“缓存的内存”之间的区别。

泄漏的内存是无法再次访问 的内存,没有引用的内存,即已分配但从未释放过的内存。这就是“泄漏”工具的发现。

被遗弃的内存是不同的。它由确实具有引用但不会再次访问的 存储器组成。这就是“调试内存图”功能所能找到的。最常见的例子是“强参考周期”。

缓存的内存是可能不再使用的 ,保留在内存中以便在应用再次需要时快速检索。在调试内存问题时,在循环浏览应用程序时,我们不必担心第一和第二次迭代之间的内存使用,而是将精力集中在后续迭代上。

无论如何,“泄漏”工具和“调试内存图”正在识别两个完全不同的问题,我希望得到不同的结果。在Swift中,FWIW的强大参考周期远比泄漏更为普遍。除非您开始研究手动分配缓冲区,非托管Core Foundation API等,否则您的Swift代码不太可能泄漏。

经常报告的泄漏是埋在操作系统或框架中的问题。鉴于这不在我们的控制范围内,所以我建议不要为它们担心太多,除非它们占用大量内存。就您而言,我们所说的是384个字节,不是我太担心的事情。

如果您看到应用程序中的内存增长,在担心泄漏之前,请确保不是上述视频中确定的第三个内存问题,即缓存的内存,可能不是 可以再次使用,但是当设备内存不足时会自动回收。

相关问题