2016-02-24 4 views
1

Если у меня есть класс, подобный этому ниже, где я создаю Drawables, а затем использую их, пока эта кнопка находится на странице, стандартно ли вы утилизировать все ImageDrawable при переопределении метода Dispose, или я должен избавиться от них в OnDetachedFromWindow, или это вообще не требуется.При подклассификации Xamarin Android.Views.View (или любого из его подклассов) мне нужно вызвать dispose на объекты, которые я создал?

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

если мой ответ не дает ответа на вопрос достаточно тщательно, войти в контакт со мной. Счастливый чат через Skype и т. Д., Чтобы объяснить это более подробно. – matthewrdev

+0

Да, ты ответил на мой вопрос. Я думал, что они не будут очищены, и я предполагал, что номер 1 был прав, но я хотел убедиться, что я ничего не пропустил. Я был немного уверен, потому что, даже не удаляя чертежи, мой код, похоже, работал нормально, но я решил, что это может вызвать проблемы в будущем – CShark

ответ

2

Это стандартная практика для Dispose() дочерних объектов в пределах родителей Dispose() метода. Когда объект происходит от Java.Lang.Object, он будет иметь соответствующую Java peer object.

После вызова Dispose() на класс, подклассы Java.Lang.Object его сверстников соединение разорвано (как удерживается IntPtr Handle собственности в Java.Lang.Object) и больше не безопасно использовать. Dispose() эффективно помещает объект в качестве кандидата GC в виртуальных машинах Mono и Dalvik.

В вашем примере выше, безопасный способ уничтожить IList<AnimationDrawable> _animations в примере 1. В качестве Dispose гарантированно будет последний метод вызывается перед объектом имеет это соединение сверстников сломаны, не следует утилизировать дочерние объекты в других обратных вызовах (например OnDetachedFromWindow), если вы не находитесь абсолютно точно он не будет использоваться повторно.

Дальнейшее чтение:

Смежные вопросы