2013-02-08 58 views
0

我有一個自定義日曆控件,有一個自定義的視圖綁定。在這個視圖綁定中,我們掛鉤了一些未解耦的事件,因此垃圾收集未完成。以下是我們的自定義視圖綁定。正如你所看到的,事件被連接到構造函數中,並且在OnSelectedDate事件中被解耦(用戶選擇一個日期)。因此,如果您選擇一個日期,則事件的分離正確並收集垃圾,但如果您剛剛返回,事件仍會掛鉤並且不會執行垃圾收集。我想過用空值觸發事件,從而使事件變得無法解決。但我認爲必須有一些更聰明的方法來實現這一點。垃圾收集問題與自定義視圖綁定單聲道觸摸和mvvmcross

namespace CmsApp.Core.Binders 
{ 
    public class CalendarViewBinding:MvxBaseTargetBinding 
    { 
     private CalendarView _calendarView; 
     private DateTime _currentValue; 
     public CalendarViewBinding(CalendarView calendarView) 
     { 
      _calendarView = calendarView; 
      _calendarView.OnDateSelected+=OnDateSelected; 
     } 

     protected override void Dispose(bool isDisposing) 
     { 
      if(_calendarView!=null) 
      { 
       _calendarView.OnDateSelected -= OnDateSelected; 
       _calendarView = null; 
      } 
      base.Dispose(isDisposing); 

     } 

     private void OnDateSelected(object sender, SelectedDateEventArgs args) 
     { 
      _currentValue = args.SelectedDate; 
      this.FireValueChanged(_currentValue); 
      _calendarView.OnDateSelected -= OnDateSelected; 
     } 

     public override void SetValue(object value) 
     { 
      var date = (DateTime)value; 
      _currentValue = date; 
      _calendarView.SelectedDate = _currentValue; 

     } 

     public override Type TargetType 
     { 
      get 
      { 
       return typeof(DateTime); 
      } 
     } 

     public override MvxBindingMode DefaultMode 
     { 
      get 
      { 
       return MvxBindingMode.TwoWay; 
      } 
     } 
    } 
} 

任何幫助表示讚賞:)

回答

0

它看起來對我來說,你的結合幾乎是正確的。

我能看到的唯一問題是,它經常取消訂閱活動 - 您不能撥打_calendarView.OnDateSelected -= OnDateSelected;兩次 - 但我不認爲這是您所看到的問題。

目前,我猜想,這個問題是不是你正在使用的代碼:

  • 要麼有在底層框架綁定代碼中的錯誤,你正在使用
  • 什麼是一個bug /問題的方式,您正在使用此綁定
  • 或你的內存泄漏無關與此結合

這並不容易從這裏張貼的有限代碼進行測試,但它如果您可以製作一個簡單的應用程序來重現您所看到的泄漏情況,則會更簡單。分享這一點,你可能會得到更多的反饋。


如果你相信我的猜測是錯誤的,那麼我可以建議的唯一的事情是,你切換到在WeakReferences裏面你的綁定 - 但這種感覺就像狗皮膏藥,而不是治療。


只要添加一個鏈接when to release objects in mono touch/mvvmcross

+0

感謝您的建議斯圖爾特,但我現在給它一個事件來解開任意事件,從而具有完整垃圾收集解決了這個問題。我會把它打開,看看我在接下來的日子裏是否會得到更好的解決方案:) – Bjarke

+0

我對你的主要建議仍然是一樣的:一起獲得一個簡單的應用程序來重現問題 - 然後其他人可以真正幫助。我正在考慮在v3中使用WeakReferences。如果僅僅是你的一個綁定就是問題,那麼把那個切換到WeakReferences將會非常快速和簡單。無論如何,祝你好運! – Stuart