0

ALAssetLibrary を使用して、アルバムと写真を取得しようとしました。これは私のコードです:

void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *結果, NSUInteger インデックス, BOOL *stop) {
        if(結果!= NULL) {
            NSLog(@"アセットを参照: %@", 結果);
        }
    };

    void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) {
        if(グループ!= nil) {
            [group enumerateAssetsUsingBlock:assetEnumerator];
        }
    };

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [ライブラリ enumerateGroupsWithTypes:ALAssetsGroupAll
                           usingBlock:assetGroupEnumerator
                         failureBlock: ^(NSError *エラー) {
                             NSLog(@"失敗");
                         }];

[group enumarateAssetsUsingBlock:assetEnumerator] で exc_bad_access を取得していますが、グループは nil ではありません。

奇妙なことに、新しいプロジェクトを作成するとこのコードは機能しますが、古いプロジェクトでは機能しません。

SDK のバージョンは iOS 4.3 です

iPhoneSimulator 4.3 でテスト済み

誰が何が起こっているのかを教えてもらえますか?

ありがとう。

4

1 に答える 1

2

あるプロジェクトではクラッシュするが、他のプロジェクトではクラッシュしない場合、設定と構成は適切ですか?

特に:

  • TARGET_DEPLOYMENT_OS が、ALAsset フレームワークが利用可能な最小バージョンに設定されていることを確認します。
  • 要求されたすべてのフレームワークが含まれていることを確認します (含めるのを忘れた場合にリンカーがこれについて警告する必要がある場合でも)

さらに、クラッシュの詳細 (クラッシュログ、例外の詳細など) があれば役立ちます。

また、列挙 (おそらく非同期で行われる) が終了する前に ALAssetLibrary が解放されていないと確信していますか? releaseあなたの質問のコードにはありませんが、実際のコードにはありますか?

enumerateGroupsWithTypes:私の知る限り、そのブロックはセカンダリ スレッドで非同期に実行されます ( SO に関するこの他の質問を参照)。これがおそらく問題です (列挙を開始してからメモリから解放されたグループを使用しようとしています。列挙が完了するまで、ALAssetLibrary がまだメモリ内にあることを確認してください)。

于 2011-09-28T14:04:57.017 に答える