忍者ブログ

佐崎司と愉快な仲間達

ゲーム、アニメ、CG、iOS開発など思いついたことを記事にしています。 管理人が3人いますので、記事にまとまりはないと思います。 iPhoneアプリのレビュー依頼も受け付けています。

UIDocumentの問題点について

わか

iOSにはUIDocumentというファイル管理オブジェクトがありますが、使用してみておかしな動作したことを書きます。(iOS7.1.3)

・ openWithCompletionHandlerが返ってこない
 UIDocumentを使用してiCloudの同期処理を試していました。使用してしばらくすると、openWithCompletionHandlerを使用してUIDocumentの内容を読み込もうとすると、いつまでたっても処理が完了しない現象が発生しました。(UIDocumentStateClosed状態でUIDocumentもnilではありません)
 この現象が発生するとアプリを再起動しても直りません。デバイスを再起動すると直りました。

考察
 デバイスを再起動することで現象が発生しなくなることから、iOS側が何らかのおかしな状態に陥っていることが分かります。Xcodeでログを確認するとUIDocumentの内部処理でセマフォロックされていました。
 現象発生前に高速でopenWithCompletionHandlerを呼び出していました。デバッグ中だったので、その際にアプリを強制終了させたかもしれません。それで、iOS側のセマフォが解放する前に終了したことが原因かと推測しました。
 
対策
 高速でopenWithCompletionHandlerを呼び出さない方が良いです。確実ではありませんが、この対策を行ってからは現象が発生していません。
 以下に条件を変更してみました。意味ない気もしますが、サンプルソースがそうなっていたので。
 if (document.documentState & UIDocumentStateClosed)
                                                  ↓
 if (document.documentState == UIDocumentStateClosed)

この現象の恐ろしいのはUIDocumentnoの非同期キューがどんどん溜まってしまい、メモリリークで落ちることです。しかもデバイスを再起動するまで続きます。

使わないでいいのであれば、UIDocumentは使わない方がいいかもしれません・・・。

拍手[0回]

PR