XCode分析器可能不会注意到哪种内存泄漏?

XCode分析器可能不会注意到哪种内存泄漏?,xcode,debugging,memory-leaks,analyzer,Xcode,Debugging,Memory Leaks,Analyzer,我担心问这个问题可能会导致一些反对票,但在做了一些不令人满意的研究后,我决定冒险去问更有经验的人 这里有许多问题涉及到与XCode Analayzer工具相关的一些特定问题。这似乎是一个非常有用的解决方案。但我想问你们——作为iOS世界的初学者——什么样的内存管理东西是这个工具无法注意到的 换句话说,是否有一些常见的内存管理方面,iOS初学者应该考虑“哦,小心点,因为在这种情况下,XCode Analyzer可能不会警告您的错误” 例如,我在这里发现: (…)分析器无法可靠地检测跨系统的保留/释

我担心问这个问题可能会导致一些反对票,但在做了一些不令人满意的研究后,我决定冒险去问更有经验的人

这里有许多问题涉及到与XCode Analayzer工具相关的一些特定问题。这似乎是一个非常有用的解决方案。但我想问你们——作为iOS世界的初学者——什么样的内存管理东西是这个工具无法注意到的

换句话说,是否有一些常见的内存管理方面,iOS初学者应该考虑“哦,小心点,因为在这种情况下,XCode Analyzer可能不会警告您的错误”

例如,我在这里发现:

(…)分析器无法可靠地检测跨系统的保留/释放问题 方法/库边界(…)


这听起来像是一个很好的提示,但也许你知道一些其他的共同问题……p> 分析器非常擅长发现困扰编写非ARC代码的新程序员的例行程序泄漏(未能调用
release
,返回错误保留计数的对象等)

根据我的经验,有几种类型的内存问题是它找不到的:

  • 它通常不能识别(也称为)。例如,您向视图控制器添加了一个重复的
    NSTimer
    ,而不知道计时器维护着对视图控制器的强引用,如果您不
    使计时器无效(或在错误的位置执行,例如
    dealoc
    方法),则视图控制器和计时器都不会被释放

  • 它找不到循环逻辑错误。例如,如果您有一些循环引用,其中视图控制器A显示视图控制器B,而视图控制器B又显示A的新副本(而不是取消/弹出以返回A)

  • 它找不到许多非引用计数内存问题。当处理核心基础函数的时候,如果你有代码进行手动内存分配(例如通过代码> MaloC 和<代码>免费< /代码>),静态分析器的使用可能有限。当您使用非引用计数代码时也是如此(例如,您使用SQLite
    sqlite3\u prepare\u v2
    并且未能调用
    sqlite3\u finalize

我确信这并不是一个完整的列表,它没有找到什么,但是这些是我看到的关于堆栈溢出的常见问题,静态分析器对这些问题的帮助有限。但是analyzer仍然是一个很好的工具(它可以发现除内存问题以外的问题),对于那些不使用ARC的人来说,它是非常宝贵的


话虽如此,虽然静态分析仪是一道被低估的第一道防线,但您确实应该使用仪器来查找泄漏。请参见《仪器用户指南》中的。这是识别泄漏的最佳方法。

仅仅因为工具可以检测到泄漏,并不意味着您不应该不太仔细地考虑内存管理。这是一个工具,不是仔细思考的替代品。你能再解释一下为什么在dealoc中使计时器无效是不好的吗?@MarkBernstein只有在不再有对视图控制器的强引用时才会调用
dealoc
。因此,由于重复计时器保持对视图控制器的强引用,因此永远不会调用它。将
invalidate
放入
dealloc
类似于说“当不再有对该视图控制器的强引用时,继续并删除计时器对该视图控制器的强引用。”通常,将
invalidate
放入
视图将消失
或类似的内容,取决于应用程序的详细信息。