iPhone开发 - 内存管理的经验教训

时间:2009-01-21 11:27:31

标签: iphone memory performance

我需要内存管理课程。我有一个使用多个视图(大约10个)的应用程序,其中一些附加到选项卡控制器。问题是我正在使用图像(我从Web服务加载的许多图像)。我面临以下问题。

  1. 当我在表格视图中滚动时,内存不断增加(为什么?) - 我从Apple的网站上检查了CustomTableViewCell应用程序,当我使用Instruments运行它时,它显示了相同的符号。

  2. 我正在使用带有许多对象的自动释放,但我发现这些对象实际上并没有被释放并且内存已经连线。我怎样才能摆脱这些物品呢?

  3. 如何告诉NSAutoreleasePool定期释放未使用的对象?我认为这可以帮助我摆脱有线内存。但我可以这样做吗?

  4. 是否有Apple或其他人(书籍或在线文章)解释如何使用仪器的例子(详见一些示例?)并微调应用程序的内存和性能?

    感谢。

5 个答案:

答案 0 :(得分:8)

现在我们对自动释放的“只说拒绝”答案,我想我会在如何更有效地使用自动释放方面添加一个提示。无论好坏,不是每个人都会完全避免自动释放 - 如果没有其他原因,因为Apple提供了许多方便的方法来交给你自动释放的对象。

您不能只告诉自动释放池释放您未使用的任何对象。没有垃圾收集,它怎么会知道呢?

您可以做的是创建一个本地自动释放池,然后在不再需要本地自动释放对象时释放它。如果你有一个创建自动释放对象的块,你将确保通过在块的开头创建一个本地自动释放池来释放它们(只需分配/初始化它,不需要魔法)然后释放池。块结束。瞧,池中的物品也被释放了。

自动释放池嵌套,因此如果您这样做,请记住这一点。如果您发布自动释放池,请确保它是最近分配的池而不是其他池。

答案 1 :(得分:1)

当控制权返回给系统时,释放自动释放的内存,但只有在选择时才会释放。如果你想强制释放内存,请使用“释放”,然后在那里工作。

应该注意的是,由于内存碎片的原因,分配和释放一块内存似乎无法让你回到可测量的“免费”内存开始的位置。

答案 2 :(得分:1)

出于性能原因,Apple建议您尽可能自行保留/释放对象。自动释放它们会导致过多的内存使用,因为自动释放的对象并不总是立即释放。

换句话说,如果您知道自己已完成某个对象,请明确释放它。

答案 3 :(得分:1)

UITableView有一种方法可以重用不再显示的表格单元格。这样,如果您一次只在屏幕上显示6个单元格,则在滚动时不会继续创建更多单元格,而是重新使用已离开屏幕的单元格。无论何时你想创建一个新的单元格,首先查询tableview以查看它是否有任何重用,如果没有,则创建一个新的。

这方面的一个例子可以在这里找到的standford iphone课程笔记的幻灯片55中找到:http://www.scribd.com/doc/7671058/Standford-CS-193P-11Performance

答案 4 :(得分:0)

根据Apple的说法,您不应该使用自动释放,而应该根据需要明确保留和释放对象。 autorelease一旦其功能结束就不会释放对象。如果在tableview中您使用从Web服务下载的图像,请尝试缓存这些图像并在可能的情况下重复使用它们。另一种选择是仅获取正在显示的图像。