【问题标题】:iPhone Development - Lessons in memory managementiPhone 开发 - 内存管理课程
【发布时间】:2010-10-02 16:03:59
【问题描述】:

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

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

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

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

Apple 或其他人是否有任何示例(书籍或在线文章)解释如何使用 Instruments(通过示例详细说明?)以及微调应用程序的内存和性能?

谢谢。

【问题讨论】:

    标签: iphone memory performance


    【解决方案1】:

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

    可以在此处找到的斯坦福 iphone 课程说明的幻灯片 55 上找到一个示例:http://www.scribd.com/doc/7671058/Standford-CS-193P-11Performance

    【讨论】:

      【解决方案2】:

      既然我们对自动释放有了“直接说不”的答案,我想我会添加一个关于如何更有效地使用自动释放的提示。不管是好是坏,并​​不是每个人都会完全避免自动释放——如果没有其他原因,只是因为 Apple 提供了许多方便的方法来交给你自动释放的对象。

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

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

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

      【讨论】:

        【解决方案3】:

        根据 Apple 的说法,您不应使用自动释放,而应根据需要显式保留和释放对象。 autorelease 不会在其功能结束后立即释放对象。如果在 tableview 中您使用的是从 web 服务下载的图像,请尝试缓存这些图像并尽可能重用它们。另一种选择是只获取那些正在显示的图像。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            应该注意的是,由于内存碎片化,分配和释放一块内存似乎无法让您回到开始时可测量的“空闲”内存。

            托尼

            【讨论】:

              猜你喜欢
              • 2011-04-10
              • 2011-10-10
              • 2010-10-28
              相关资源
              最近更新 更多