【问题标题】:Memory Management/Instruments on the iPhoneiPhone 上的内存管理/仪器
【发布时间】:2011-03-16 17:12:22
【问题描述】:

我正在开发一个 RSS 阅读器类型的 iPhone 应用程序,它即将完成,但是我昨天升级到带有 iOS 4.3 的 Xcode 4,并且遇到了一些严重的内存问题。我的应用程序现在经常收到内存警告,我正在处理 didReceiveMemoryWarning,并释放我所有的缓存图像等,但这并不能提供良好的用户体验。我也一直在使用 Instruments 来尝试诊断问题,但这带来的问题多于答案。

• SDK 4.3 是否使用更多内存?在升级之前我没有收到内存警告。不确定这是否相关,但我的大部分测试都是在装有 iOS 4.2 的 iPhone 3G 上进行的(3G 不支持 4.3)。

• 为什么分配工具工具的活动字节列与活动监视器工具中的实际内存列不匹配?活动监控工具总是报告更多的内存使用情况。

• 根据泄漏,我的应用程序在模拟器或实际 iPhone 上没有泄漏内存,但是当我查看分配时,似乎当我在视图之间转换然后弹出视图时,实时字节列没有返回到它以前的值,这与泄漏内存一致? (是的,子视图在弹出后会被释放)

• 我的应用程序在启动时经常报告内存警告,但仅在我分析存在泄漏的应用程序时才如此。泄漏会导致额外的内存开销吗?

• 也许这是一个很难回答的问题,但对于 iPhone 应用程序来说,合理的内存占用是多少?当我运行泄漏时,我的应用程序几乎肯定会在运行几分钟后由于内存不足而被终止,但泄漏工具中的分配报告我在应用程序终止时使用的内存少于 2 MB。

• 为什么活动监视器仪器有一个虚拟内存列?我读过的所有内容都表明 iPhone 不使用虚拟内存?

【问题讨论】:

  • 通常你应该将一组问题分解成单独的问题,除非这些问题紧密交织在一起。这有助于提高网站的可搜索性和可用性。

标签: iphone memory-management memory-leaks xcode4


【解决方案1】:

4.3 SDK 可能确实使用了更多内存,但如果这是您要问的问题,那么您可能走错了路,因为作为开发人员,不应考虑您的应用程序的稳定性。

我不会担心 Allocations 报告的内容与 Activity Monitor 报告的内容之间的差异。当视图被推送和弹出而不是缩小时,内存占用量增长也很正常。 how free(3) works 上的另一个答案更详细地解释了这种现象。

iOS 应用的合理内存占用是应用运行所需的最低内存量。

iOS 确实使用虚拟内存。来自 Apple 的内存使用性能指南/About the Virtual Memory System

Mac OS X 和 iOS 都包含一个完全集成的虚拟内存系统,您无法关闭它;它始终处于开启状态。两个系统还为每个 32 位进程提供高达 4 GB 的可寻址空间。

...

虽然 Mac OS X 支持后备存储,但 iOS 不支持。在 iPhone 应用程序中,已经在磁盘上的只读数据(例如代码页)只是从内存中删除,并根据需要从磁盘重新加载。操作系统永远不会从内存中删除可写数据。相反,如果可用内存量下降到某个阈值以下,系统会要求正在运行的应用程序自愿释放内存以为新数据腾出空间。未能释放足够内存的应用程序将被终止。

我建议您通读整个文档,尤其是Finding Memory Leaks。您还可以使用 Build-and-Analyze 功能,该功能使用内置 Clang 静态检测多种错误,包括内存泄漏。

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 2011-10-10
    • 2010-10-28
    相关资源
    最近更新 更多