0

iPhoneのカメラロールから最後の写真を取得しようとしています。次のコードを使用します。

UIImage* __block image = [[UIImage alloc] init];
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];

[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup* group, BOOL* stop) {

    [group setAssetsFilter:[ALAssetsFilter allPhotos]];

    if ([group numberOfAssets] > 0) {
        [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:[group numberOfAssets]-1] options:NSEnumerationConcurrent usingBlock:^(ALAsset* alAsset, NSUInteger index, BOOL* innerStop) {
            if (alAsset) {
                ALAssetRepresentation* rawImage = [alAsset defaultRepresentation];
                image = [UIImage imageWithCGImage:[rawImage fullScreenImage]];
                [self doTheJobWithImage:image];
                // Inside doTheJobWithImage: a segue is also performed at the end
            }
        }];
    }
} failureBlock:^(NSError* error) {
    NSLog(@"Error: %@", [error localizedDescription]);
}];

動作しますが、欠陥があります (デバッグに Instruments and Zombies を使用しています)。

  • カメラロール内のすべての画像を読み取るようです。では、最初の質問: enumerateAssetsAtIndexes ではなく、指定された画像 (atIndexes) のみを取得しますか? コードの何が問題になっていますか?
  • 前の問題に加えて、多くの写真がカメラ ロールにある場合、メモリが問題になります。アプリが多すぎるとクラッシュするか、機能する場合は、取得した画像の割り当てが解除されないように見えるため、このコードを 2 回目または 3 回呼び出すと、メモリ リークが原因でクラッシュします。2 番目の質問: doTheJobWithImage: を呼び出した後、コードにすべての割り当てを強制的に解除するにはどうすればよいですか?

xcode 4.6、ios 6、および ARC を使用しています。前もって感謝します。

4

1 に答える 1

1

数時間後、ここのコードに問題がないことがわかりました。これは、カメラ ロールの最後の画像を抽出するための適切なコードです (誰かがそれを必要とする場合)。問題は doTheJobWithImage: 内にあり、置き換えて解決しました

[self doTheJobWithImage:image];

結果の画像を別の場所に保存し、 doTheJobWithImage: 画像の列挙が行われた後に実行します..他の誰かが興味を持っている場合に備えて、これを言います。

于 2013-02-17T21:35:19.813 に答える