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

When subclassing Xamarin Android.Views.View (or any of its subclasses), do I need to call dispose on objects I created?

如果我有一个像下面这样的 class,我在其中创建 Drawable,然后在该按钮位于页面上时使用它们,那么在覆盖 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;
    }
}

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

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

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

进一步阅读: