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

本文关键字:子类 是否 disp 调用 对象 创建 Views Android Xamarin View 任何 | 更新日期: 2023-09-27 18:35:59

如果我下面有一个这样的类,我在其中创建可绘制对象,然后在页面上的此按钮时使用它们,那么在覆盖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);
    }
}

阿拉伯数字。

public class ExampleImageButton : ImageButton
{
    private IList<AnimationDrawable> _animations;
....
    protected override void OnDetachedFromWindow()
    {
        foreach(var item in _animations) 
        {
            item.Dispose();
        }
        _animations = null;
    }
}

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

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

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

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

延伸阅读:

  • Xamarin.Android Garbage Collection
  • Xamarin Android 终结器在离开活动转到另一个活动时未被调用
  • System.ArgumentException'jobject' 不得为 IntPtr.Zero。参数名称:jobject