【问题标题】:Best approach to debugging applicationDidReceiveMemoryWarning on iPhone?在 iPhone 上调试应用程序 DidReceiveMemoryWarning 的最佳方法?
【发布时间】:2010-10-14 14:18:49
【问题描述】:

需要有关如何调试此问题的建议。我是新手,环境有限,以前没有嵌入式或智能手机编程经验,所以我可以使用一些线索。 已经意识到: Instruments、Clanger 静态分析、手动代码审查等。 Instruments 似乎总体上很有帮助,但非常耗时,而且很多时间都被冻结了! Clanger 也帮助了我很多。总的来说,我似乎只是消耗了太多的内存,我想知道什么是好的策略。我会释放一些顶级对象吗?有“首选策略”吗?

只是想知道是否有人成功解决了这个问题,以及他们是否有其他建议?谢谢大家。

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory-leaks


    【解决方案1】:

    有很多关于 iPhone 应用程序内存管理的好文章。这里有一些有用的链接。

    一般情况下你应该注意的事情

    1. 释放任何不需要的变量
    2. 始终处理didReceiveMemoryWarning 并释放所有未使用的变量
    3. 停止applicationDidReceiveMemoryWarning 中的任何占用大量内存的进程,例如音频/视频播放、UIImagePickerController 等

    编辑 这不再适用。 imageNamed: 在 3.x 操作系统版本之前存在缓存问题。该问题不再存在,您应该使用 imageNamed: (使实现视网膜显示更容易)

    1. 请勿使用imageNamed: 创建 UIImage 对象。

    【讨论】:

    • 我知道这是旧的,但只是想知道为什么上面没有 4 ?使用 imageNamed 有什么问题?
    • imageNamed: 点现在不适用。在 3.x 之前,imageNamed 用于缓存图像,增加了应用程序使用的内存。他们现在已经极大地改进了它。所以3.x及以上,可以使用这种方法。
    【解决方案2】:

    基本上,您收到此警告是因为(不出所料)iPhone 的内存严重不足。这通常可能是由于以下两个原因之一;

    1. 您有内存泄漏。
    2. 您分配的对象过多,需要重新审视您的设计。

    对于第一个,您应该运行仪器并检查您的内存分配。这确实会减慢您的应用程序的速度(并且需要额外的内存),因此请尝试一次测试一个应用程序的区域。例如。如果您有多个视图在它们之间切换几次。

    第二个你将不得不检查你正在做的事情,这些事情可能会导致大量的内存分配。例如,如果您正在编写 Flickr 浏览器,您可能需要随时减少已加载的图像数量,或者在收到此警告时释放一些未使用的图像。

    这些是我在不了解您的应用的情况下可以建议的唯一一般规则。

    不幸的是,没有真正的方法(据我所知)从 iPhone 操作系统获取当前内存分配的数据。这使得隔离应用程序中无意中占用内存的区域变得非常困难。

    【讨论】:

    • 3.您必须处理无法一次全部加载到内存中的网络 xml/图像/数据(如桌面),并且必须以较小的部分处理
    • 就更好的设计理念而言,Apple 文档中的 SQLite Books 示例描述了一种水合/脱水策略。自述文件很好地解释了这一概念,并提供了实现此模式的数据对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多