C # / MonoTouch EventHandler становится нулевым после отображения компонента;делегат пропадает? - PullRequest
0 голосов
/ 13 октября 2010

У меня есть UIPickerViewModel, который должен вызывать событие при изменении выбранного значения, но к моменту вызова Selected значение EventHandler будет нулевым.Код (несколько упрощенно):

public class MyPickerViewModel: UIPickerViewModel {
    public event EventHandler SelectionChanged;

    public void PrintWhetherSelectionChangedIsNull() {
         System.Console.WriteLine(SelectionChanged == null ? "yes" : "no");
    }

    public override void Selected(UIPickerView picker, int row, int comp) {
        if (SelectionChanged != null) { // it always is, though
            SelectionChanged(this, new EventArgs());
        }
    }
}

public class SomeView: UIView {
    SomeView(MyPickerViewModel model) {
        model.SelectionChanged += delegate(object s, EventArgs e) { 
            DoSomething();
        }

        model.PrintWhetherSelectionChangedIsNull(); // prints "no"
    }

    private void DoSomething() { /* never called */ }
}

Я почти уверен, что есть только один экземпляр модели, и что EventHandler не равен нулю, прежде чем снова стать нулевым.

IЯ предполагаю, что делегаты, которых я добавил в EventHandler, собирают мусор или что-то в этом роде, но это всего лишь предположение.Может кто-нибудь указать мне хороший учебник по жизненным циклам объектов C # / iOS?

Обновление: Я попытался использовать именованную EventHandler, переменную экземпляра в представлении, и проблема все еще существует,Так что это не просто проблема сбора мусора.

1 Ответ

0 голосов
/ 14 октября 2010

Попробуйте обновить SomeView, чтобы он сохранял значение модели, просто чтобы быть уверенным, что по какой-то причине он не выпускает ссылку для себя.

public class SomeView: UIView { 

    MyPickerViewModel _model;

    SomeView(MyPickerViewModel model) {  
        _model = model;

        _model.SelectionChanged += delegate(object s, EventArgs e) {   
            DoSomething();  
        }  

        _model.PrintWhetherSelectionChangedIsNull(); // prints "no"  
    }  

    private void DoSomething() { /* should be called now */ }  
}
...