在我的项目中当我开始在内存图调试器中查找泄漏时,发现的泄漏很少并进行了修复,现在使用内存图没有发现泄漏。仪器->泄漏的问题,有时显示泄漏,有时不显示泄漏,如照片中所述,泄漏从一开始就立即出现,我几乎不了解是什么原因导致泄漏。如果内存图显示没有泄漏,我可以相信吗?或有一种泄漏未被内存图捕获。代码如何初始化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
}
答案 0 :(得分:6)
观看这段古老的视频Fixing Memory Issues,它向我们介绍了“泄漏”,“废弃的内存”和“缓存的内存”之间的区别。
泄漏的内存是无法再次访问 的内存,没有引用的内存,即已分配但从未释放过的内存。这就是“泄漏”工具的发现。
被遗弃的内存是不同的。它由确实具有引用但不会再次访问的 存储器组成。这就是“调试内存图”功能所能找到的。最常见的例子是“强参考周期”。
缓存的内存是可能不再使用的 ,保留在内存中以便在应用再次需要时快速检索。在调试内存问题时,在循环浏览应用程序时,我们不必担心第一和第二次迭代之间的内存使用,而是将精力集中在后续迭代上。
无论如何,“泄漏”工具和“调试内存图”正在识别两个完全不同的问题,我希望得到不同的结果。在Swift中,FWIW的强大参考周期远比泄漏更为普遍。除非您开始研究手动分配缓冲区,非托管Core Foundation API等,否则您的Swift代码不太可能泄漏。
经常报告的泄漏是埋在操作系统或框架中的问题。鉴于这不在我们的控制范围内,所以我建议不要为它们担心太多,除非它们占用大量内存。就您而言,我们所说的是384个字节,不是我太担心的事情。
如果您看到应用程序中的内存增长,在担心泄漏之前,请确保不是上述视频中确定的第三个内存问题,即缓存的内存,可能不是 可以再次使用,但是当设备内存不足时会自动回收。