MFMailComposeViewController使用太多内存

时间:2011-04-26 11:11:43

标签: objective-c memory-leaks mfmailcomposeviewcontroller

当我尝试使用MFMailCompose将图像作为附件(summar size~4mb)发送时,活动监视器说,使用了100(+ - 2)mb的内存。发送或取消内存后释放大约20兆字节,但如果共享项目与图像被解除分配,剩余的80兆字节会发生什么? 感谢:!)

1 个答案:

答案 0 :(得分:4)

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

压缩JPEG和PNG等图像。当他们被吸引到屏幕时,他们是未压缩的。

快速的经验法则是确定图像在显示时将消耗多少内存

memory consumed = (width * height) * 4

例如,磁盘上2 KB但是62 x 52像素的图像实际上将消耗12,896字节或12 KB。我想在磁盘上4 MB的映像将消耗超过4 MB的数据。

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

也许尝试一次只发送一张图片。您还需要意识到,当您完成图像和MFMailComposeViewController时,它们会释放它们,否则肯定会成为泄漏源。

另请注意您最初如何加载图片。 UIImage的{​​{1}}方法实际缓存了图片。缓存的图像仅在低内存情况下被清除,因此如果您没有达到限制,它们可以暂停一段时间。

最后,您已经注意到您正在看到乐器中的内存消耗,但您实际上已经确认它实际上是一个问题吗?在测试应用程序连接到Instruments或调试器时,您是否因内存不足而遇到应用程序崩溃?

没有身体是完美的 - 这也适用于Apple。过去有记录在案的案例中,Apple的框架显示内存泄漏(imageNamed:的缓存在iOS 2.x中泄露),但是当你发现内存出现峰值时,我不会那么快地责怪框架记忆消耗。如果泄漏仪器没有显示任何泄漏,并且分析仪没有显示任何问题,最可能的情况是它只是内存消耗而不是泄漏。

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