当子类化Xamarin Android.Views.View(或其任何子类)时,我是否需要对我创建的对象调用dispose?

时间:2016-02-24 15:55:47

标签: c# xamarin xamarin.android idisposable

如果我有一个类似下面这样的类我创建Drawables然后在页面上有这个按钮时使用它们,那么在重写Dispose方法时处理所有ImageDrawable是否合乎一样,或者我应该处理它它们在OnDetachedFromWindow中,或者根本不需要它。

1

public class ExampleImageButton : ImageButton
{
    private IList<AnimationDrawable> _animations;

....

    protected override void Dispose (bool disposing)
    {
        if(disposing)
        {
            foreach(var item in _animations) 
            {
                item.Dispose();
            }
            _animations = null;
        }
        base.Dispose (disposing);
    }
}

2

public class ExampleImageButton : ImageButton
{
    private IList<AnimationDrawable> _animations;

....

    protected override void OnDetachedFromWindow()
    {
        foreach(var item in _animations) 
        {
            item.Dispose();
        }
        _animations = null;
    }
}

1 个答案:

答案 0 :(得分:2)

在父Dispose()方法中,Dispose()子对象是标准做法。当一个对象派生自Java.Lang.Object时,它将具有相应的Java peer object

在子类Dispose()的类上调用Java.Lang.Object后,其对等连接被中断(由IntPtr Handle中的Java.Lang.Object属性保存)并且不再安全使用。 Dispose()有效地将对象标记为Mono和Dalvik虚拟机中的GC候选对象。

在上面的示例中,销毁IList<AnimationDrawable> _animations的安全方法在示例1中。由于Dispose保证是在对象断开对等连接之前调用的最后一个方法,因此不应该在其他回调(例如OnDetachedFromWindow)中处理子对象,除非您绝对确定它将不会再次使用。

进一步阅读: