当对 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
)中处理子对象,除非您绝对确定它不会被再次使用。
进一步阅读:
如果我有一个像下面这样的 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
)中处理子对象,除非您绝对确定它不会被再次使用。
进一步阅读: