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

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

enter image description here在我的项目中当我开始在内存图调试器中寻找泄漏时,我发现很少并修复了它们,现在使用内存图没有发现泄漏。 Instruments->leaks 的问题,有时显示泄漏,有时不显示,泄漏立即从照片中描述的开始出现,我几乎不明白导致泄漏的原因。如果内存图显示没有泄漏,我可以相信吗?或者存在一种内存图未捕获的泄漏。代码如何初始化 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
        
}

最佳答案

在 2013 年的视频中,Fixing Memory Issues ),Apple 区分了“泄漏”、“废弃内存”和“缓存内存”,如下所述。有关更多现代讨论,请参阅 WWDC 2021 视频 Detect and diagnose memory issues , WWDC 2019 视频 Getting Started with Instruments , 和 WWDC 2018 视频 iOS Memory Deep Dive .

  • 泄漏的内存是不能再次访问的内存,没有引用的内存,即已经malloc的内存。 'ed 但从不 free 'd。
  • 废弃的内存由确实有引用但不会被再次访问的内存组成。
  • 缓存内存是可能不会再次使用的内存,保存在内存中以便在应用程序再次需要时快速检索。

  • “调试内存图”擅长发现和可视化由强引用循环引起的问题。 “泄漏”工具不会识别这些问题。由于强引用循环等在 Swift 代码中更为普遍,“调试内存图”通常是更有成效的第一道防线。
    在调试内存问题时,我们不太担心循环遍历应用程序时第一次和第二次迭代之间的内存使用情况,而是专注于后续迭代。
    无论如何,“泄漏”工具和“调试内存图”关注不同的问题,会产生不同的结果。泄漏没有找到强引用循环。同时,“调试内存图”功能在查找传统泄漏方面变得更好。
    FWIW,在 Swift 中,强引用循环比传统的要常见得多 malloc -但没有- free泄漏。除非您开始深入研究缓冲区的手动分配、非托管 Core Foundation API 等,否则您的 Swift 代码不太可能存在传统泄漏。
    如果您看到应用内存在增长,在担心泄漏之前,请确保这不是上述视频中发现的第三个内存问题,即缓存内存,可能不会再次使用,但会在出现时自动回收设备内存不足。

    顺便说一句,偶尔有报告称操作系统或框架中存在漏洞。如果 (a) 您没有看到堆栈跟踪中引用的目标;或 (b) 泄漏无关紧要,那么我建议您根本不要太担心它们。在你的情况下,我们谈论的是 384 字节,我不会太担心。

    关于iOS 内存泄漏,内存图调试器未显示泄漏,但同时 Xcode-Instruments-leaks 显示泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62716045/

    相关文章:

    ios - 无法在 Carthage 依赖管理器 iOS 中从 RxSwift 导入模块

    ios - Swift-CompositionalLayout-计算高度

    ios - Swift 上的 AFNetworking

    swift - 如何使用 `AVCaptureSessionPreset320x240` ?

    python - Matplotlib 错误会导致内存泄漏。我怎样才能释放那段内存?

    javascript - 你如何干净地删除 Prototype JS 中的 DOM 元素?

    ios - 停止 UISearchDisplayController 显示空单元格

    iphone - 如何在键盘存在时使 UITextView 向上移动

    ios - iOS 中的动画饼图

    java - Hibernate 中的 c3p0 中可能存在内存泄漏?