0

我有一个通用应用程序,它本质上是一个包含图像和文本的文章列表,以及应用程序左侧下方的菜单。我有谷歌分析,以及解析的框架。

iPad 和 iPhone 上的应用程序的唯一区别是,侧边菜单在 ipad 上始终可见,并且一些界面对象会四处移动。(列表的单元格布局不同——但内容相同)。

图像是使用一组类异步加载的,这些类是我编写的,用于下载/保存在 NSCache 对象中,并使用 NSOperationQueue 保存在磁盘上。(当用户离开应用程序时,磁盘缓存被擦除)。NSCache 设置为最大大约 10 mb。(假设图像大小为图像高度*图像宽度*每张图像 4 字节)。(这里的代码两者都是相同的,所以它不应该是罪魁祸首,但它是应用程序内存使用的一大块)。

我在运行 iOS 5.0 的旧 iphone4 上遇到内存警告/崩溃问题,因此我使用 Activity Monitor Instrument 运行该应用程序,并注意到一些非常奇怪的事情:

在 iPad(运行 iOS 5.1 的 iPad 2)上,应用程序启动,加载了立即可见的图像,并且使用了大约 16mb 的内存。

在它推出的 iPhone4 上,加载了可见图像并使用了大约 35mb 的内存——比我预期的要多得多。

为了检查这是否是操作系统内存问题,我还在运行 iOS6 的 iPhone5 上运行了该应用程序,它使用的内存量与 iPhone 4 大致相同。

我检查了我的媒体和故事板文件,看看是否有任何不同,但我找不到任何可以以任何显着方式改变内存使用的东西。

有什么办法可以减少iphone上应用程序的内存使用?我想不出它会使用这么多内存的原因。

4

1 回答 1

0

很难看到......正如一个人所说,请注意视网膜设备将根据来源使用更多内存,如果在捆绑包中设置@2x 图像,它将加载它们,并且它们使用更多内存。是否尝试过使用分配来分析虚拟内存?使用内存通常很好,即使它会触发内存警告,问题是你如何响应它,它是否释放了足够的内存?尝试使用模拟器来模拟内存警告。请注意,sim 使用的内存比设备多。另一点是,由于 ARC 很难创建泄漏,但创建保留周期和废弃内存更容易。正确的对象生命周期应以对象释放结束。你说你使用 NSCache 并从网络异步加载图像,我有 3 条建议给你:

  1. 你知道源上的原始图像大小吗?也许 iPad 上的源图像比 iPhone 上的小。下载图像后的正确方法是根据真正需要的大小调整它的大小(我的意思是重绘不只是拉伸)你可以使用 Quartz 或使用 ImageIO 来实现
  2. 在内存警告之后,我从来不理解 NSCache 的行为,Apple 说它会刷新内存,但在 iOS4 上进行了一些测试(我现在不知道)我不同意。我创建了自己的子类来观察内存警告并刷新内存
  3. 你完全确定你正在从缓存中取回图像吗?
于 2013-06-14T06:18:24.500 回答