在子类化 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;
}
}
标准做法是在父对象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