我怎样才能摆脱Objective-C中的常驻脏内存?

我观看了苹果的WWDC 2010video高级内存分析仪器,从那里,我能够find很多居民脏记忆。 我意识到,有这么多居民脏的记忆是一件坏事(也许是我的应用程序崩溃了这么多的解释…),但我不知道如何解决它。 我应该在哪里看?

仪器向我展示了很多可能有用的信息,这些信息对我来说看起来就像是胡言乱语,比如:

% of Res Type Resident Size 18% VM_ALLOCATE (8192 pages) 32.00 MB 

这是在“脏”类别 – 32 MB的常驻脏内存是一个只有256 MB的设备很多,对吧? :)有几个这样的大块。 我如何追溯到我的仪器的代码? 或者我应该忘记仪器,并在我的代码中寻找具体问题?

在设备或模拟器上运行时,是否看到这个32 MB大小的VM_ALLOCATE?

我问,因为当我在使用OS X应用程序的分配工具时,我也注意到了一个32 MB的VM_ALLOCATE块,我想知道这是否是在OS X环境中运行的副产品。 在设备上运行可能会给你一个不同的数据集。

一般来说,驻留内存是您的应用程序正在使用的内存不会换出到磁盘。 在iOS上,没有交换,所以驻留内存应该等于您的虚拟内存占用量。

脏内存是你分配和使用的内存。 脏内存应该比常驻内存less,因为后者包含代码(你的和框架)。

我不确定你在应用程序中究竟做了什么,但是我猜你已经从你的包中加载了一些大的资产,并且保留了它们。 尽可能不要这样做。

在加载使用内存映射技术的NSData对象时,也可以使用API​​,而不是强制读取字节。 这些可以更好,因为它允许操作系统从磁盘懒懒地读取页面。 有了NSData(因为它是不可变的),它也可能足够聪明,将页面标记为只读。 从理论上讲,这对操作系统来说是一个有价值的提示,它可以在压力下清除这些页面,因为它知道它们不能改变。 阅读+[NSData dataWithContentsOfMappedFile:]的文档。

对于图像,我记得阅读一些build议避免imageNamed:东西imageNamed:除了您经常使用的图像(即UI元素)。 特别是对于大图像,它们可以保留在你无法控制的caching中。 ( imageNamed:在2.x天有一个泄漏,但在3.x被修复,并且今天是完全安全的。)使用imageWithContentsOfFile:更大的图像和图像,不是你的用户界面的循环部分。

如果您从networking加载图像,请将其caching到磁盘上,并在创buildUIImage后释放原始字节。 如果图像视图由于内存压力而被卸载,则不需要再次点击networking来加载数据,但是您也不希望加载两个副本( NSDataUIImage )。

使用新的xCode 4,来自xCode 3的工具仍然具有更好的用户界面来分析您的应用程序,包括泄漏和内存使用情况。 我build议你看看这些工具,然后一个接一个地看看他们提供了什么。 您可以在主菜单Product上的xCode 4中访问这些工具,然后 – > Profile

希望这可以帮助

在仪器中,单击启用快照自动将视图模式更改为区域映射。 在文件的path名称中查找,当你的应用程序生活在vmpages中的时候使用哪个文件。 在videowwdc的例子中,他们正在使用encryption文件,这是推到vmpages,没有u代码太难build议比[库刷新] 🙂

“这是在”肮脏的“类别 – 32 MB驻留脏内存…”“我还注意到一个32 MB的VM_ALLOCATE块,我想知道…”

当我在模拟器中分析我的应用程序时,我在VM跟踪器中看到相同的“VM_ALLOCATE(8192页)32 MB”,用于驻留,脏和虚拟列。

为了比较,我已经介绍了由Paul Hegarty 非常丰富的iTunes U斯坦福大学课程构build的(较小的)演示应用程序 – 例如心理学家和graphics计算器 – 并且在每个应用程序中都看到相同的条目。

我是一个“域名家伙”,对内存pipe理的细节还没有很好的把握,所以我不能提供一个权威性的解释,但是似乎有理由得出结论:这个分配是由框架在模拟器上运行的所有应用程序都是通用的。 (我没有在设备上运行它们。)

(FYI:运行10.7.3的MacBook Pro上的Xcode 4.3)