如果我有一个类似下面这样的类我创建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;
}
}
答案 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
)中处理子对象,除非您绝对确定它将不会再次使用。
进一步阅读: