【发布时间】:2012-09-06 13:31:07
【问题描述】:
我的 iPhone 应用程序由于内存不足而崩溃。我可以看到崩溃后保存了一个名为 lowmemory 的崩溃日志。但是,代码中没有泄漏。
还有其他方法可以减少内存使用吗?当在模拟器中分析应用程序时,我可以看到内存使用量(分配)高达 91 mb,我怀疑这是应用程序在设备(iPhone 3GS)上崩溃的地方。那时我正在做很多字符串替换(基本上我在 HTML 中替换了大约 100 个标签)。
【问题讨论】:
我的 iPhone 应用程序由于内存不足而崩溃。我可以看到崩溃后保存了一个名为 lowmemory 的崩溃日志。但是,代码中没有泄漏。
还有其他方法可以减少内存使用吗?当在模拟器中分析应用程序时,我可以看到内存使用量(分配)高达 91 mb,我怀疑这是应用程序在设备(iPhone 3GS)上崩溃的地方。那时我正在做很多字符串替换(基本上我在 HTML 中替换了大约 100 个标签)。
【问题讨论】:
首先,我不认为您的应用使用了高达 91mb(太大)。我认为 91mb - 是分配的内存大小(可以释放,但这个数字没有减少)。 你能检查一下 Live Bytes 列吗? 关于字符串替换:我不知道您如何使用此类功能。但我建议你在这种情况下避免使用 NSString 并使用 NSMutableString 并更改内部的字符串值 - 这样可以避免每次分配 NSString 对象。
【讨论】:
您应该尝试使用 Instruments 工具。您可以使用 XCode (cmd + I) 启动 Instruments 工具,也可以不使用 XCode (cmd + space => Instruments)。
如果您使用 XCode 启动 Instruments,我建议使用“Leaks”选项。您应该按“泄漏”,选择“调用树”而不是“统计”,然后 - 根据我的经验 - 选中以下复选框:隐藏 Obj-C、展平递归、隐藏丢失的符号、隐藏系统库。 在这里,该工具会向您显示在运行期间被上诉的行。
另一种方法是在没有 XCode 的情况下启动 Instruments。您应该在这里使用“活动监视器”,选择您的设备并记录它的活动。您应该双击其中一项统计信息以获取统计信息列表。找到您的应用程序的名称,然后查看“Real Memory”列。稍微玩一下您的应用程序,如果内存在增加并且没有释放,您应该知道哪些类用于您所做的操作,并且您应该检查您的类。
注意:如果您在没有 XCode 的情况下启动 Instruments,请确保应用程序不是在调试模式下从 XCode 启动的。 XCode 4.0 中有一个错误(我不知道后来是否更正了),但发生在我身上,Activity Monitor 的 Real Memory 列没有显示正确的信息。
注意2:如果您要进行内存管理测试,您应该始终使用设备进行测试。总是。
编辑: 你甚至可以在你的项目中尝试 XCode 中的“cmd + shift + B”快捷键,它暗示了一些可能的内存泄漏。有时它很有用,但该工具并非每次都正确:)
【讨论】: