3

我的应用程序正在下载 base64 编码的内容,在大多数情况下是 PDF 文档。它通过 Web 服务传输并封装在 SOAP 中。文档的大小可达 100 MB。

要在本地存储这些文件,我需要从 SOAP 信封中提取它们,解码 base64 字符串并写入存储。

问题是,大约 1 MB 的文档会使临时内存使用量增加 20-30 MB。在 Instruments 中跟踪分配时,我可以看到这些峰值。这不是什么大问题。但是 60 MB 的文档会增加大约 800 MB 的内存,这对于 iOS 设备来说绝对是太多了。

我正在尝试更改应用程序,以便可以防止或至少降低峰值。唉,我不完全知道哪些代码行负责。

是否有可能单步执行代码并同时查看当前分配或内存使用情况?

我知道当应用程序由 Instruments 执行时,单步执行不起作用。那么,还有其他选择吗?

下面是 Instruments 的样子: 在此处输入图像描述

提前致谢!

4

2 回答 2

4

为了跟踪某个时间段内的分配情况,我通常做的是使用检查范围按钮在时间轴中标记起点和终点:

仪器检测范围按钮

这会过滤分配列表,并仅显示在该时间段内完成的分配。我通常按​​“# living”列进行排序,以找出在此期间分配了哪些类型的对象。打开扩展的详细信息面板后,我选择了哪个可疑对象,然后单击类名旁边的箭头:

工具分配

这将显示该类型对象的实例列表。选择一个,将在扩展面板中向您显示堆栈跟踪。该信息已经可以提示您如何分配这些对象。

此外,如果您再次使用类名旁边的箭头选择特定实例,您将看到该对象在内存事件方面的历史记录。此外,如果您双击堆栈跟踪调用,它将显示发生该内存事件的代码:

对象堆栈跟踪

有了这些信息,您应该能够知道发生了什么。如果您选择的对象不是罪魁祸首,您可以继续检查其余对象。为了导航回对象列表,您可以单击导航栏中的“对象摘要”:

分配工具导航栏

很好的狩猎。

于 2013-04-10T01:08:28.647 回答
1

查看此链接,该链接可帮助您了解堆分配。它将帮助您跟踪分配。希望这会有所帮助。您还可以使用活动监视器,它可以让您在使用应用程序时在任何特定时间跟踪应用程序消耗的内存。

您还可以检查分配内存的代码,请找到附加的屏幕截图。在此处输入图像描述

于 2013-04-03T06:48:23.583 回答