以前の記事「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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。