8

私はiOS5でこのようにクラッシュしなかったiOSアプリを持っていますが、4または5 bg/fgサイクル後の起動時にiOS6で一貫してクラッシュしています。この問題は、ALAssetsLibrary enumerateGroupsWithTypesの呼び出しにまでさかのぼります(アプリは、起動するたびに基になるフォトライブラリに同期します)。enumerateGroupsWithTypesの呼び出しは、ディスパッチキューを介して呼び出されたバックグラウンドスレッド内から行われるため、ユーザーがアプリをbgに送信した後でも、同期コードを終了できます。私が受け取るクラッシュメッセージは常に同じです:

* __addContextToList_block_invoke_0()、/ SourceCache / PhotoLibraryServices / MobileSlideShow-1647.5 / Sources / PLManagedObjectContext.m:1305でのアサーションの失敗

*キャッチされなかった例外'NSInternalInconsistencyException'が原因でアプリを終了しています。理由:'コンテキストが多すぎます。contextListにスペースがありません。

これらのエラーメッセージをグーグルで検索しても、何も得られませんでした。これは、アプリが少なくとも5回オン/オフを繰り返すまで発生しないため、ブロックが終了したときにAppleデータ構造からブロックが正しく削除されていない可能性があると思いますか?リードを事前に感謝します。

更新:さらに調査した後、これはALAssetsGroupLibraryの同期に関連しているようです。ALAssetsGroupSavedPhotosのみを同期する場合、またはALAssetsGroupLibraryに写真が0枚ある場合、クラッシュは発生しません。ALAssetsGroupLibraryのみを同期し、そこに少なくとも1枚の写真がある場合に発生します。

4

4 に答える 4

7

これはすべて、同期ごとにALAssetsLibraryを再割り当てすることに関連していることがわかりました。代わりにメンバー変数を追加することにより、クラッシュが解消されたように見えます。

AssetsLibrary = [[ALAssetsLibrary alloc] init];

これは明らかに私のコードにとってより効率的で優れた設計ですが、私が抱えていた問題は、ALAssetsLibraryとスレッドに関するARCの問題を示していると思います。必ず1回だけ割り当ててください。

于 2012-11-21T17:29:29.293 に答える
1

私は同じ問題を抱えていました:

簡単に言うと、ALAssetsLibraryインスタンスがタイプで列挙している間、またはALAssetsGroup最後のステップで列挙されたインスタンスがアセットを列挙している間は、すべての列挙ブロックが終了するまで、ALAssetsLibraryインスタンスとインスタンスを変更しないでください。ALAssetsGroup

于 2012-11-29T08:06:24.760 に答える
0

ALAssetsLibrary列挙はメインスレッドで実行されます(このSOの回答を参照)。これは、アセットライブラリが位置データを使用するためのアクセス許可を得るためにユーザーと対話する必要があるためだと思います(写真にはジオタグが付いているため)。

ALAssetsLibraryがバックグラウンドスレッドで実行され続けることをコードが想定している場合、これが問題の原因である可能性があります。

于 2012-12-10T03:59:41.973 に答える
0

これをチェックアウトできます。以前にこの問題が発生しましたが、シングルトンALAssetsLibraryオブジェクトを作成して修正してください

https://stackoverflow.com/a/32693118/3103450

于 2015-09-21T10:45:02.550 に答える