XCode Analyzer可能没有注意到哪种内存泄漏?

gui*_*eak 8 debugging xcode memory-leaks analyzer

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

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

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

例如,我在这里找到了为什么XCode静态分析器无法检测未释放的保留属性?那:

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

这听起来像是一个很好的提示,但也许你知道其他一些常见的问题......

Rob*_*Rob 7

分析器非常擅长发现困扰新程序员编写非ARC代码的常规泄漏(调用失败release,返回错误保留计数的对象等).

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

  • 它通常不能识别强参考循环(也称为保留循环).例如,您NSTimer向视图控制器添加重复,不知道计时器维护对视图控制器的强引用,如果您没有invalidate计时器(或在错误的位置执行,例如dealloc方法),则不会视图控制器和计时器将被释放.

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

  • 它找不到很多非引用计数内存问题.虽然它在处理Core Foundation功能方面越来越好,但如果您的代码正在进行手动内存分配(例如via mallocfree),则静态分析器的使用可能有限.每当您使用非引用计数代码时(例如,您使用SQLite sqlite3_prepare_v2并且无法调用sqlite3_finalize),情况也是如此.

我确定这不是一个完整的列表,它没有找到它,但这些是我在Stack Overflow上看到的常见问题,静态分析仪对它的帮助有限.但是分析仪仍然是一个很棒的工具(它也会发现除了内存问题之外的其他问题),对于那些不使用ARC的人来说,这是非常宝贵的.

话虽如此,虽然静态分析仪是一个不受重视的第一道防线,但你真的应该使用仪器来发现泄漏.请参阅" 仪器用户指南"中的" 查找应用程序中的内存问题".这是识别泄漏的最佳方法.

  • @MarkBernstein只有在没有对视图控制器的强引用时才会调用`dealloc`.因此,因为重复计时器维持对视图控制器的强引用,所以永远不会调用它.将`invalidate`放在`dealloc`中类似于说"当没有对该视图控制器的强引用时,继续并删除定时器对该视图控制器的强引用." 您通常会将`invalidate`放在`viewWillDisappear`或类似的内容中,具体取决于您应用的详细信息. (3认同)