4

私は以前、Objective-C言語を使用してiOSアプリを開発し、そのdealloc方法に依存して、アプリケーションでいくつかのクリーンアップ/登録解除タスクを実行していました。現在、MonoTouch(ガベージコレクション)では、オプションではなくなりました。

UIViewControllerそのプロパティのサブビューとして(サブクラス)Viewのインスタンスを追加するがあるとします。次に、別のマネージャー/グローバルオブジェクトからいくつかのイベントを受信するように自分自身を登録し、それに応じて自分自身を更新する方法を認識します(例:) 。MyViewUIViewMyViewonlineProfilesManager.Refreshed += () => <update UI with the new state>;

MyView画面に表示されている限り、すべて問題ありません。MyViewただし、イベントハンドラーから登録を解除できるように、画面からいつ削除されるかを知る必要があります。

Obj-Cでは、これはメソッドで簡単に行うことができます。これはdealloc、画面が変更されると、UIViewController割り当てが解除MyViewされ、そのスーパービューから削除されてから、MyViewdeallocメソッドが呼び出されるためです。

モノタッチでは、この「決定論的」フローはもうありません。UIViewControllerとデストラクタにいくつかのprintステートメントを入れようとしましたMyViewが、呼び出されません(理由は、MyViewがまだイベントハンドラに登録されているためです。いつ/どのように登録を解除するかわからないため、割り当てが解除されることはありません)。

誰かがMonoTouchでそのような状況を処理するための「パターン」が何であるか知っていますか?基本的なコンセプトが欠けていて、アプリの開発に苦労していると思います。

前もって感謝します。


編集 私の問題の解決策は弱いイベントパターンを使用しているように見えるので、質問を編集していますが、MonoTouchプラットフォームの実装が見つかりませんでした。

MonoTouchで弱いイベントパターンを使用する方法を知っている人はいますか?

4

2 に答える 2

6

イベントを処理する最良の方法は、ViewWillDisappearでイベントの登録を解除し、ViewWillAppearで登録することです。これは、登録を解除するためのメソッドへの参照がないため、匿名メソッドを使用できないことを意味します。

それが必要なものに合わない場合は、このhttp://sgmunn.com/blog/2012/05/non-gcd-event-handlers/のようなことを行うことができます。

乾杯。

于 2013-02-26T00:21:48.867 に答える
1

弱いイベントを探している場合は、ここで私の「メッセンジャー」の実装を試すことができます

TinyIoCで利用できるものに触発されていますが、反射などを少なくするために再実装しました。

于 2013-02-26T16:14:46.403 に答える