减少iPhone上通用应用程序的内存使用量

时间:2013-06-13 22:18:12

标签: iphone ios objective-c ipad ios-universal-app

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

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

使用我编写的一组类异步加载图像,以便使用NSOperationQueue下载/保存在NSCache对象和磁盘上。 (当用户离开应用程序时擦除磁盘缓存)。 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上应用程序的内存使用量?我认为没有理由会使用这么多内存。

1 个答案:

答案 0 :(得分:0)

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

  1. 您知道源上的原始图像大小吗?也许在iPad上的源图像比iPhone上的图像要小。下载图像后的正确方法将根据实际需要的大小调整大小(我的意思是重新绘制非拉伸),您可以使用Quartz或使用ImageIO实现这一目标
  2. 我从未理解过内存警告后NSCache的行为,Apple说它会刷新内存但是在iOS4上进行一些测试后(我现在不知道)我不同意。我创建了自己的子类,用于观察内存警告和刷新内存
  3. 您是否完全确定要从缓存中取回图像?