【问题标题】:iPhone App takes up too much memoryiPhone App占用太多内存
【发布时间】:2011-02-17 11:02:53
【问题描述】:

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

这意味着如果我然后用相机拍照,默认为 8MB,它甚至在选择器调用它的委托之前就会发出内存警告(几个)!

我如何知道是什么占用了这么多内存,以及如何删除它?我已经删除了所有调试符号并添加了 [-Os],但它仍然占用大量内存!

--- 编辑---

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

【问题讨论】:

  • 将解决问题拆分成一个单独的问题。
  • 我的测试人员的越狱手机似乎加剧了这个问题。它将图像很好地保存到磁盘 - 但不会将其加载到内存中。

标签: iphone image optimization memory


【解决方案1】:

好的,如果您的应用在磁盘/购物车上不是很大,这意味着您的应用内部正在进行一些非常大的内存分配。在你的 memAlloc/new() 函数上放置一个中断或日志跟踪器,看看是什么占用了你的空间。解压缩的大型 GUI 组件可能是罪魁祸首,非常大的缓冲声音文件也可能是罪魁祸首。尽管如此,如果没有该日志跟踪,我们只能猜测。而是转到源代码。

【讨论】:

    【解决方案2】:

    内存警告不好的唯一情况是没有内存可以释放。然后它们变成内存故障,应用程序终止。

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

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

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

    虽然在没有内存警告的情况下运行可能是一个令人钦佩的目标,但您通常需要分配内存并且保留它更有效,除非它需要用于其他事情。当图像从内存缓存中清除时,下次必须从磁盘中读取。

    如果您知道某个图像只需要一次或很少需要,您可以通过调用[UIImage imageNamed:] 之外的调用来加载它以避免缓存。例如,仅在应用程序启动时加载的辅助闪屏。

    【讨论】:

    • 我正在加载的大多数图像来自捆绑包,或者来自用户拍照或从库中加载。我认为我遇到的问题是用相机拍照 - 我在代表保存之前丢失了照片。在我将它写入磁盘之前,它似乎已经清理干净了。
    • 啊,我错过了这个问题。我一次打开了足够多的图像,超过了 24MB 左右,所以你遇到了麻烦。我没有更多可提供的,但如果不是自动释放,在[UIImage dealloc] 中设置断点可能会有所帮助。我的直觉是,这只是部分与内存警告有关,还有其他问题。祝你好运。
    猜你喜欢
    • 2015-10-14
    • 2013-07-18
    • 2013-07-11
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多