配置文件 - 单声道 - 其他根逆向参考

时间:2013-03-05 13:33:22

标签: xamarin.ios garbage-collection profiler monotouch.dialog xamarin-studio

处理Monotouch.Dialog实例时:

  • 自定义UIBubbleMapElement元素由GC处理;
  • 对于每个已处理元素,GC也会处理自定义UIBubbleMapCell;
  • 但对于所有已处置的单元格,其自定义UIBubbleMapView均未被处置。

要解决此问题,我开始使用Mono Profiler应用程序。

Mono profiler showing only a root reference.

问题是:查看未处理的UIBubbleMapView实例反向参考图像。我如何发布最后一个引用并允许收集我的自定义视图?

最后,这是我的UIBubbleMapCell处置方法:

protected override void Dispose (bool disposing) {

    bubbleMapView = null;

    System.Diagnostics.Debug.WriteLine ("############# {0} 'Dispose' {1}.", this, disposing ? "invoked directly" : "called by the garbage collector finalizer");

    base.Dispose (disposing);
}

这就是我打印到控制台的内容:

############# <UIBubblesViewController: 0x152427c0> 'Dispose' called by the garbage collector finalizer.
############# <UIBubbleMapCell: 0x152b6a40; baseClass = UITableViewCell; frame = (0 195; 320 38); autoresize = W; layer = <CALayer: 0x152c65c0>> 'Dispose' called by the garbage collector finalizer.
############# <UIBubbleMapCell: 0x1524aba0; baseClass = UITableViewCell; frame = (0 35; 320 38); autoresize = W; layer = <CALayer: 0x152038f0>> 'Dispose' called by the garbage collector finalizer.
############# <UIBubbleMapCell: 0x17c91710; baseClass = UITableViewCell; frame = (0 233; 320 116); autoresize = W; layer = <CALayer: 0x152cbb80>> 'Dispose' called by the garbage collector finalizer.
############# <UIBubbleMapCell: 0x1520b2c0; baseClass = UITableViewCell; frame = (0 108; 320 52); autoresize = W; layer = <CALayer: 0x17c2fc30>> 'Dispose' called by the garbage collector finalizer.

编辑:感谢Rolf的回答。

首先,我在UITableViewCell Dispose方法中添加了下一个代码:

bubbleMapView.Dispose ();
bubbleMapView = null;

虽然收到控制台内的下一条消息,但Mono分析器仍然将对象显示为未收集。与以前相同的图像。

 ############# <UIBubbleMapView: 0x154af370; frame = (0 0; 1 1); layer = <CALayer: 0x154af0e0>> 'Dispose' invoked directly.

在intruments App中运行时,我可以看到它的引用数大于1。

Visible memory leak.

在图像中有一个UIBubbleTextView实例,但它的行为与UIBubbleMapView实例完全相同。

我的UIBubbleMapView包含其他一些观点。这是未检查反向引用时的分析器信息。是否有一些技巧可以处理这些子视图?

No inverse references

1 个答案:

答案 0 :(得分:3)

<Other Root>通常是GCHandle Xamarin.iOS在内部使用来保持托管对象的活动状态,直到释放相应的本机对象。打破这个链接的一种方法是在对象上调用Dispose(你没有提到在UIBubbleMapView上调用Dispose),在这种情况下,管理对象将由GC收集(当然,除非它被其他托管代码引用)。 / p>

很可能有一些其他本机代码持有对此UIBubbleMapView实例的引用,但是要确切了解您需要使用仪器中的分配工具进行分析(启用引用计数跟踪以准确跟踪保留的代码)对象)。

<强>更新

在托管对象上调用Dispose之前,托管对象将保留本机对象[1]。这意味着如果保留计数> 1,然后有另外的本机保留到该对象(这也意味着一旦你在对象上调用Dispose,其余的引用都是本机的)。请注意,此时可能会由GC收集托管对象,因此您无法再使用HeapShot跟踪(本机)对象,您必须使用Instruments。

提示:如果在Instruments中启用右侧栏,您将获得每个保留/释放呼叫的堆栈跟踪。这对于追踪谁保留对象非常有帮助。

[1]一旦保留计数达到1,Xamarin.iOS也将释放托管对象的引用(并且GC已确定托管对象未从其他托管代码引用)。