【问题标题】:Image Question for iPad - Memory issuesiPad 图像问题 - 内存问题
【发布时间】:2011-03-23 00:04:23
【问题描述】:

所以我在 ipad 上安装了我的应用程序,但由于内存问题,它崩溃了。我想这是因为我使用了非常大的图像文件,所以我返回并缩小了它们,并通过调整它们的大小然后使用 PNGCrush 基本上削减了大约 75% 的大小。

现在,至于运行程序,如果我的 4 个单独选项卡中的每一个都有一个背景图像,如果我每次切换选项卡时都将图像设置为 Null 是否会节省内存,还是应该保留它们设置?我有一个页面,上面有几十个图像,因为它们充当按钮,从我听到的声音来看,当我不查看该页面时,我应该将它们全部清除。对吗?

现在,当我启动时,我会以一种“现在加载并完成它”的心态加载应用程序中所有内容的所有图像,尽管从我一直在阅读的内容来看,这会导致内存问题因为没有太多内存可以使用。这是否意味着每次我切换选项卡或视图时,我都想从不可见的图像中清除所有图像,然后在我们返回时重新加载它们?这会导致性能提升吗?或者至少可以防止崩溃?我的程序在模拟器中运行,但是当我在我的 ipad 上运行它时它就爆炸了 =/

谢谢!

编辑:我正在使用 Monotouch BTW,因此一切都在 C# 中

UIImage BG = UIImage.FromFile("Images/Makes/explosion.png");
UIImage basic = UIImage.FromFile("Images/Models/camaro.png");
UIImage advance = UIImage.FromFile("Images/search.png");

AdvancedSearchButton.SetBackgroundImage(advance, UIControlState.Normal);
ImageSearchButton.SetBackgroundImage(basic, UIControlState.Normal);
MainBG.Image = BG;

BG.Dispose();
basic.Dispose();
advance.Dispose();

现在我知道在常规 C# 中 dispose() 实际上并没有“释放”内存,但我读到一些内容说当它编译到 obj-c 时它会转换为 "release",这样基本上就是释放那些对象。

另外,我想知道在我不再查看它们之后是否需要dispose() 的各个按钮和图像。我只是将图像设置为 NULL,但这给了我错误。

MainBG.Dispose();
AdvancedSearchButton.Dispose();
ImageSearchButton.Dispose();

非常感谢您的帮助!

EDIT2:

所以我只是尝试了上面的代码,背景图像和其他所有内容都仍然存在,看起来好像什么都没有被清除。有什么建议吗?

【问题讨论】:

    标签: ipad memory-management xamarin.ios ios-simulator


    【解决方案1】:

    iPhone 没有虚拟内存,也没有垃圾收集。因此,一旦将某些内容加载到内存中,它就会一直保留在内存中,直到您的代码显式释放它为止。如果您不使用某些资源,则绝对应该尽快清理它们。

    此外,您应该听取来自 iOS 的内存不足警告,这是您的代码进行内部清理的另一个机会。

    【讨论】:

    • “因此,一旦将某些内容加载到内存中,它就会一直保留在内存中,直到您的代码明确释放它”这是否意味着如果我在选项卡 1 中设置背景,我会想要“释放它”通过将其设置为空?这项工作是否存在或还有其他我需要做的事情。我了解释放/释放内存的概念,我只是不知道在这种情况下如何去做。我的大部分应用只是带有图片的按钮。
    • 在将指针设置为 NULL 之前,您需要向支持的 NSImage 对象发送 release 消息。
    • 所以基本上我会从我的文件中加载我的 NSImage,将我的图像设置为那个,然后释放 NS 图像?当我从那个选项卡切换到另一个选项卡时,我会将该图像设置为空。如果我回到那个标签,我会冲洗并重复。对吗?
    • 嗯,不。当您离开选项卡时,您必须释放 NSImage,而不是在加载它之后立即释放。 :-) 顺便说一句,如果您更改代码以显示如何加载图像,人们将能够更好地帮助您。
    • monotouch 确实有垃圾回收功能?!
    【解决方案2】:

    首先,延迟加载您的资源,除非您有正当理由不这样做。其次,我不确定您的图像有多大,但是在大图像(本质上用于背景或其他用途的图像)上,一般来说,我会将它们切成块,然后再次加载它们猜到了,懒洋洋地当他们需要的时候。

    您应该做的是正确处理内存警告。取消分配任何非绝对关键的资源——即其他选项卡中其他视图上的项目或隐藏内容。您可以在需要时再次加载它们。

    您还应该看看使用 Instruments 来确定您是否泄漏(我希望您已经这样做了),检查您的程序,看看您是否可以在内存不足的情况下将一些缓存的资源保存到磁盘,等等

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多