Uitableview 单纵断面vs XCode仪器。描述

Uitableview 单纵断面vs XCode仪器。描述,uitableview,mono,xamarin.ios,monotouch.dialog,xamarin,Uitableview,Mono,Xamarin.ios,Monotouch.dialog,Xamarin,我正在iPhone上评测我的应用程序。我正在创建许多UIWebView,并将它们粘贴在一个MonoTouch.Dialog表中(比如1000)。我有一个按钮,用于清除表部分,并处理WebView和对任何WebView的任何引用 我注意到在Mono Profile中,UIWebview的实例降到了零(这是应该的)。但是,如果我使用工具(分配)进行相同的测试,它表明“实时”网络视图的数量从未减少,内存也从未恢复。我甚至尝试了GC.Collect,但没有任何区别 我还看到Mono剖面图显示,使用的总r

我正在iPhone上评测我的应用程序。我正在创建许多
UIWebView
,并将它们粘贴在一个MonoTouch.Dialog表中(比如1000)。我有一个按钮,用于清除表部分,并处理WebView和对任何WebView的任何引用

我注意到在Mono Profile中,
UIWebview
的实例降到了零(这是应该的)。但是,如果我使用工具(分配)进行相同的测试,它表明“实时”网络视图的数量从未减少,内存也从未恢复。我甚至尝试了GC.Collect,但没有任何区别

我还看到Mono剖面图显示,使用的总ram约为1.5兆欧,而仪器显示的ram约为5兆欧


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

如果在Mono profiler中UIWebView实例的数量减少了,但在Instruments中没有减少,这意味着本机代码保留了对这些实例的引用,从而阻止了它们的发布

我建议您在分配工具中启用“记录引用计数”选项,然后在UIWebView实例仅出现在工具中时调查重新计数-您需要将每个retain调用与释放调用配对(但至少会有一个您无法配对的调用,这就是您正在寻找的调用)。此时,您需要弄清楚为什么retain调用没有相应的release调用


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

如果Mono profiler中的UIWebView实例数量减少,而不是仪器中的UIWebView实例数量减少,则表示本机代码持有对这些实例的引用,阻止他们被释放

我建议您在分配工具中启用“记录引用计数”选项,然后在UIWebView实例仅出现在工具中时调查重新计数-您需要将每个retain调用与释放调用配对(但至少会有一个您无法配对的调用,这就是您正在寻找的调用)。此时,您需要弄清楚为什么retain调用没有相应的release调用


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

我认为这是一个误解

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

  • UITableView
    使用
    UITableViewCell
    实例。然而,为了最小化内存需求,它尽可能地重用单元。因此,一个有1000个单元格的表,在屏幕上只显示12个单元格,可能只需要分配(不超过)12个单元格(不是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个缓存/可重用单元)

  • 当您处理由
    对话框ViewController
    分配的
    UITableView
    时,这些单元格将被释放。否则(缓存的)单元格不在您的控制之下


    • 我认为这是一种误解

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

      • UITableView
        使用
        UITableViewCell
        实例。然而,为了最小化内存需求,它尽可能地重用单元。因此,一个有1000个单元格的表,在屏幕上只显示12个单元格,可能只需要分配(不超过)12个单元格(不是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个缓存/可重用单元)

      • 当您处理由
        对话框ViewController
        分配的
        UITableView
        时,这些单元格将被释放。否则(缓存的)单元格不在您的控制之下


      谢谢,这非常有帮助,也证实了我的想法。我正在处理一切可能的事情,并调用GC.Collect,但运气不好,所以我将不得不收集一个简单的样本,看看它是否显示了问题。可能是本机代码中的错误。我已经确认,当Web视图托管在对话视图控制器中时,处理这些视图存在问题。我创建了一个用于跟踪的bug。谢谢,这非常有帮助,也证实了我的想法。我正在处理所有可能的事情并调用GC.Collect,但运气不好,因此我将不得不创建一个简单的sampl