2010/12/21

UIDocumentInteractionControllerDelegateの処理の流れについて

以前の記事「safx: UIDocumentInteractionControllerを用いて別アプリケーションを開くメニューを表示する方法について」において、解放周りのコードが間違えていたようなので訂正を兼ねてDocumentInteractionControllerDelegateの処理の流れを調べてみました。

上図はUIDocumentInteractionControllerにおいて、presentOptionsMenuFromRect:inView:animated:を呼び出したときの処理の流れになります。丸四角が呼び出されるデリゲートメソッド、四角がウィジェット状態の変化を示しています。なお、メソッド名があまりにも長いため、最初のdocumentInteractionControllerを「DIC」と省略しています。また、緑文字はオプションメニューでタップしたボタンがどれかということを示しており、その個所がユーザの入力待ちになることを意味します。そして、点線はクイックルックが表示されていることを示しています。

ここで、オプションメニューとクイックルックとはそれぞれ次のようなものであるとします。

以前のコードだと、presentOptionsMenuFromRect:inView:animated:の直後にretainして、documentInteractionControllerDidEndPreview:内でautoreleaseをしていたのですが、これだとクイックビュー以外ではコントローラが解放されなくなってしまいます。

2010.12.30追記: 上図の「 別アプリを選択」のフローが間違っていたので訂正しました (以前の図)。また、それに伴ない、次の記述は誤りになります。親クラスで管理するのが最良の方法のようです。

そのため、上図において+1の個所でretain、−1の個所でautoreleaseするのがよいようです (presentOptionsMenuFromRect:inView:animated:とDocumentInteractionControllerDidMismissOptionMenu:の組み合わせのみだとクイックルックを選択した場合Abortしてしまう)。

まとめ

DocumentInteractionControllerDelegateの処理の流れについて述べました。

関連項目

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。