8

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

这里有很多问题是指与 XCode Analayzer Tool 相关的一些具体问题。这似乎是一个非常有用的解决方案。但是我想问你——作为iOS世界的初学者——这个工具不能注意到什么样的内存管理东西。

换句话说,有没有什么常见的内存管理方面,iOS初学者应该考虑“哦,小心那个,因为在这种情况下XCode Analyzer可能不会警告你你的错误”......

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

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

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

4

1 回答 1

7

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

根据我的经验,它没有发现几种类型的内存问题:

  • 它通常不能识别强引用循环(也称为保留循环)。例如,您NSTimer向视图控制器添加重复,不知道计时器保持对视图控制器的强引用,并且如果您不invalidate使用计时器(或在错误的地方执行此操作,例如dealloc方法),则视图控制器和计时器都不会被释放。

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

  • 它找不到许多非引用计数内存问题。虽然它在处理 Core Foundation 函数方面变得越来越好,但如果您有执行手动内存分配的代码(例如 viamallocfree),静态分析器的使用可能会受到限制。每当您使用非引用计数代码(例如,您使用 SQLitesqlite3_prepare_v2并且调用失败sqlite3_finalize)时,情况都是如此。

我确信这不是它找不到的完整列表,但这些是我在 Stack Overflow 上看到的常见问题,静态分析器对此的帮助有限。但是分析器仍然是一个很棒的工具(它也可以发现内存问题以外的问题),对于那些不使用 ARC 的人来说,它是无价的。

话虽如此,虽然静态分析器是被低估的第一道防线,但您确实应该使用 Instruments 来查找漏洞。请参阅Instruments 用户指南中的在您的应用程序中定位内存问题。这是识别泄漏的最佳方法。

于 2013-03-08T14:36:10.440 回答