1

我正在 iPhone 上分析我的应用程序。我正在创建很多UIWebView并将它们粘贴在 MonoTouch.Dialog 表中(比如说 1000 个)。我有一个按钮可以清除表格部分并处理 webviews 和对任何 webviews 的任何引用。

我注意到 Mono Profile 的实例UIWebview下降到零(应该如此)。但是,如果我使用 Instruments (Allocations) 进行相同的测试,它表明“实时”Webview 的数量永远不会减少,内存也永远不会恢复。我什至尝试了 GC.Collect 并没有什么不同。

我还看到 Mono 配置文件说正在使用的总内存大约是 1.5 兆,而在仪器中显示大约 5 兆。

第一项让我更关心,因为我似乎无法恢复该内存并销毁所有这些实例。我读错了还是有其他问题?谢谢。

4

2 回答 2

4

如果 UIWebView 实例的数量在 Mono 分析器中下降,但在 Instruments 中没有,这意味着本机代码持有对这些实例的引用,从而阻止它们被释放。

我建议您在 Allocations 工具中启用“记录引用计数”选项,然后在 UIWebView 实例仅显示在 Instruments 中时调查 retainCount - 您需要将每个保留调用与释放调用配对(但至少会有一个你不能配对,这就是你要找的那个)。此时您需要弄清楚为什么该保留调用没有相应的释放调用。

Mono 配置文件和 Allocations 工具实际上都没有告诉您正在使用的 ram 总量(并且它们测量不同的东西,这就是数字不同的原因)。Mono 分析器仅测量托管对象,而 Allocations 对象测量除托管对象外的大多数(但不是全部)本机分配。

于 2013-01-29T12:39:59.180 回答
1

我认为这是一个误解。

  • MonoTouch.Dialog 基于UITableView. 它可以隐藏很多复杂性,但底层行为仍然是相同的;

  • UITableView使用UITableViewCell实例。然而,为了尽量减少内存需求,它会尽可能重用单元。因此,一个包含 1000 个单元格的表格,在屏幕上只显示十几个,可能只需要分配(不超过)十几个单元格(而不是 1000 个)。

正常(或 MT.D)代码如下所示:

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
    var cell = tableView.DequeueReusableCell ("cell") as MyCell;
    if (cell == null) {
        // create new cell
        cell = new MyCell ();
    } else {
        // prepare cell for reuse
    }
    // customize cell
    return cell;
}

可能发生的是:

  • 您创建 1000 个元素;

  • 当被问及元素创建一个单元格时,大约 14 次填充屏幕,然后它会重复使用它们(例如,如果你滚动);

  • section.Clear清除 UI(不是UITableView单元缓存);

  • Instruments 向您显示UITableView已分配的内容(例如 14 个缓存/可重用单元);

  • UITableView当您处置由 分配的 时,这些单元格将被释放DialogViewController。否则(缓存的)单元格不受您的控制;

于 2013-01-29T19:59:25.180 回答