iPhone开发-内存管理的教训

8
我需要关于内存管理的课程。我有一个使用多个视图(大约10个)的应用程序,其中一些附加到选项卡控制器上。问题是,我正在使用图像(从Web服务加载的许多图像)。我面临以下问题:
  1. 当我在表视图中滚动时,内存不断增加(为什么?)-我检查了苹果网站上的CustomTableViewCell应用程序,并在使用Instruments运行时显示相同的迹象。
  2. 我正在使用autorelease与许多对象,但我发现这些对象实际上并没有被释放,内存被固定了。我如何摆脱这些对象?
  3. 如何告诉NSAutoreleasePool定期释放未使用的对象?我认为这可以帮助我摆脱固定内存。但我能做到吗?
是否有苹果或其他人(书籍或在线文章)的示例,说明如何使用Instruments(以稍微详细的示例)和优化内存和性能的应用程序?
谢谢。
5个回答

8
现在我们已经了解了“拒绝自动释放池”的答案,我想补充一下如何更有效地使用自动释放池的技巧。无论好坏,不是每个人都会完全避免使用自动释放池 - 如果没有其他原因,那就是因为苹果提供了许多方便的方法来交付自动释放对象。
你不能只是告诉自动释放池释放你不再使用的任何对象。没有垃圾回收,否则它怎么知道呢?
你可以创建一个本地自动释放池,然后在不再需要本地自动释放对象时释放它。如果你有一个块,其中创建了自动释放对象,你可以通过在块的开头创建一个本地自动释放池(只需分配/初始化即可,无需魔法),然后在块的结尾释放该池来确保它们被释放。这样,池中的所有对象也将被释放。
自动释放池是嵌套的,请记住这一点。如果你释放了一个自动释放池,请确保它是最近分配的池而不是其他池。

1

自动释放的内存会在控制权返回系统时被释放,但只有在系统选择时才会释放。如果您希望强制释放内存,请使用“release”,它可以立即起作用。

需要注意的是,由于内存碎片化,分配和释放一块内存可能看起来并没有将可测量的“空闲”内存恢复到最初状态。

Tony


1

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

换句话说,如果您知道您已经完成了一个对象的使用,请明确地释放它。


1
UITableView有一种重用表格单元的方法,这些单元不再显示。这样,如果您在屏幕上仅显示6个单元格,则随着滚动,它不会继续创建更多的单元格,而是重复使用已经离开屏幕的单元格。每当您想要创建新单元格时,请首先查询tableview以查看是否有可重用的单元格,如果没有,则创建一个新的单元格。

可以在斯坦福iPhone课程笔记的第55张幻灯片上找到此示例:http://www.scribd.com/doc/7671058/Standford-CS-193P-11Performance

0
根据苹果公司的建议,您不应该使用autorelease,而应该根据需要显式地保留和释放对象。autorelease不能在其功能结束后立即释放对象。如果在tableview中使用从网络服务下载的图像,请尝试缓存这些图像并在可能的情况下重复使用它们。另一个选项是仅获取正在显示的那些图像。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接