处理Monotouch.Dialog实例时:
UIBubbleMapElement
元素由GC处理; UIBubbleMapCell
; UIBubbleMapView
均未被处置。要解决此问题,我开始使用Mono Profiler应用程序。
问题是:查看未处理的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。
在图像中有一个UIBubbleTextView
实例,但它的行为与UIBubbleMapView
实例完全相同。
我的UIBubbleMapView
包含其他一些观点。这是未检查反向引用时的分析器信息。是否有一些技巧可以处理这些子视图?
答案 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已确定托管对象未从其他托管代码引用)。