2009-01-21 39 views
8

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

  1. 记忆保持,当我在表视图滚动增加(为什么?) - 我检查从苹果公司的网站上的应用程序CustomTableViewCell,它的显示,当我与仪器运行相同的符号。

  2. 我使用autorelease与许多对象,但我看到这些对象实际上并没有释放和内存连线。我怎样才能摆脱这些对象?

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

有没有苹果或其他人讲解如何使用仪器(书或网上文章)的任何实例(在一个小的细节与例子吗?),并以微调内存和性能的应用程序?

谢谢。

回答

8

既然我们已经对autorelease做出了“不说”的回答,我想我会添加一个关于如何更有效地使用autorelease的提示。无论是更好还是更糟糕,并非每个人都会完全避免自动释放 - 如果没有其他原因,而不是因为Apple提供了许多便利方法来处理自动释放对象。

你不能只是告诉autorelease池释放任何你不使用的对象。没有垃圾收集,而且还有其他什么知识?

你可以做的是创建一个本地自动释放池,然后在你不再需要本地自动释放对象时释放该池。如果你有一个创建自动释放对象的块,你可以通过在块的开头创建一个本地自动释放池来释放它(只需alloc/init,不需要任何魔法),然后释放池块的结尾。瞧,池中的物体也被释放。

自动释放池嵌套,所以请记住,如果你这样做。如果您释放自动释放池,请确保它是最近分配的池,而不是其他池。

1

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

应该注意的是,由于内存碎片,分配和释放内存块可能无法让您回到开始测试“空闲”内存的位置。

Tony

1

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

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

0

根据Apple的说法,您不应该使用autorelease,而应该根据需要明确保留和释放对象。一旦函数结束,autorelease不会释放一个对象。如果在tableview中使用从webservice下载的图像,请尝试缓存这些图像并尽可能重新使用它们。另一种选择是只获取正在显示的图像。

1

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

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