2010-05-09 95 views
0

好的,这是我的问题。我的iPhone应用程序在磁盘上为1.2MB。当然,我有一堆用于GUI按钮和背景的图像等。在内存中,我的应用占用了高达15MB!iPhone应用程序占用太多内存

这意味着如果我使用相机拍摄一张8MB的默认照片,即使在选取器调用它的代表之前,它也会给出一个内存警告(几个)!

我该如何判断抓住这么多内存以及如何去除它?我已经删除了所有调试符号并添加了[-Os],但它仍占用大量内存!

---编辑---

我的应用程式是否在strongfortressgames.weebly.com - 应用程序 “Thunderclash” 占用了15 MB!这是一个愚蠢的小应用程序!我怎样才能让这些更小?

+0

将解决问题分解为单独的问题。 – 2010-05-09 21:50:13

+0

我的测试仪的越狱手机似乎加重了这个问题。它将图像保存到磁盘上 - 但不会将其加载到内存中。 – 2010-05-14 14:15:14

回答

2

唯一的时间内存警告是坏的,如果没有内存释放。然后他们成为内存失败,应用程序终止。

一旦你加载像png和jpg这样的压缩图像到内存中,它们就会被解压缩,并且通常占用10倍的大小。当您使用[UIImage imageNamed:]时,它将图像缓存在内存中。这是由xib加载的任何图像隐含的。当它收到内存警告时,它会释放缓存中的图像。

您拥有的不是图像的任何视图都可能将渲染内容缓存在内存中。当收到内存警告时,缓存将被清除,除非当前显示。整个视图层次结构也可能由当前未显示的视图控制器释放。

内存警告是应用程序运行时的正常部分。它们不表示内存泄漏。他们只是告诉你和系统应该释放空闲内存。

尽管在没有内存警告的情况下运行它可能是一个令人钦佩的目标,但通常需要分配内存,除非其他内容需要,否则保留内存效率更高。从内存缓存清除映像时,下次必须从磁盘读取映像。

如果您知道的图片只会一次或很少需要,您可以通过除[UIImage imageNamed:]之外的呼叫加载它以避免高速缓存。例如,仅在应用程序启动时加载的辅助启动画面。

+0

我要加载的大多数图像来自Bundle,或者来自用户从图库中加载图片或加载的图片。 我认为我遇到的问题是用相机拍照 - 在委托人保存之前我失去了照片。在我可以写入磁盘之前,它似乎要清理房屋。 – 2010-05-10 12:00:26

+0

啊,我错过了这个问题。我一次打开足够的图像超过24MB左右,你有麻烦。我没有更多的东西可以提供,但是可能在'[UIImage dealloc]中设置一个断点将有助于它不是自动发布。我的直觉是,它只是部分与记忆警告有关,而其他的则是错误的。祝你好运。 – drawnonward 2010-05-10 16:38:32

0

好的,如果你的应用程序在磁盘上/购物车上的容量不是很大,这意味着你的应用程序内部会有一些非常大的内存分配。在你的memAlloc/new()函数中放置一个中断或日志跟踪器,看看你的空间在吃什么。解压缩的大型GUI组件可能是非常大的缓冲声音文件的罪魁祸首。但是,没有那个日志追踪,我们只能猜测。请转到源代码。