2011-04-26 77 views
1

当我尝试使用MFMailCompose作为附件发送图像(总和大小〜4mb)时,活动监视器说,使用了100(±2)mb的内存。发送或取消内存后释放~20兆字节,但如果与图像共享项目被释放,其余80兆字节发生了什么? 谢谢!:)MFMailComposeViewController使用太多的内存

回答

4

图像的文件大小和它在显示时消耗的内存量是两个完全不同的东西。

压缩了诸如JPEG和PNG之类的图像。当它们被拖拽到屏幕上时,它们是未压缩的。

拇指的快速规则弄清楚多少内存显示时的图像会消耗是

memory consumed = (width * height) * 4 

实施例,也就是2 KB磁盘上的图像,但是62 X 52的像素将实际消耗12896字节或12 KB。我想象一个磁盘上4 MB的映像会消耗大于4 MB的空间。

问题是,当您将它们作为附件添加并因此解压缩并占用内存时,MFMailComposer会在它的组合视图中显示图像。所以你的4MB图像实际上比你想象的要消耗更多。

也许尝试一次只发送一个图像。您还需要注意,当您完成这些操作时,您将释放图像和MFMailComposeViewController,否则这肯定会成为泄漏的来源。

另外请注意您最初如何加载图像。 UIImageimageNamed:方法实际上缓存图像。缓存的图像只在内存不足的情况下被清除,所以如果你没有达到极限,它们可以暂停一段时间。

最后,你已经注意到你看到了Instruments的内存消耗,但是你是否真的证实了它实际上是一个问题?您是否在测试应用程序时由于内存不足而导致应用程序崩溃,而连接到乐器或调试器的是而不是

没有身体是完美的 - 这也适用于苹果。过去有过文档记载的案例,苹果的框架显示内存泄漏(UIImage的缓存在iOS 2.x中泄露),但当你注意到内存消耗急剧增加时,我不会那么快责怪框架。如果泄漏仪器没有显示任何泄漏,并且分析仪没有显示任何问题,最有可能的情况是它只是简单地消耗内存而不是泄漏。

重要的是要记住,iOS设备没有像计算机那样的千兆字节的RAM。你需要保守你使用的记忆。如果这意味着不同时发送XX MB图像,那就是它必须的方式。