iPad的图像问题 - 内存问题

时间:2010-07-29 22:32:39

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

所以我在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:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

您应该做的是正确处理您的记忆警告。释放任何非绝对关键的资源 - 即其他选项卡中其他视图中的项目或隐藏内容。您可以在必要时再次加载它们。

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