5

PHAssetすべてのユーザーをPHAssetMediaTypeImage取得してから、対応するユーザーを一度に取得して反復処理しようとしUIImagesています。私の iPhone 5 には約 2,000 枚の写真があり、このコードは 587 枚の写真を反復処理した後にクラッシュします。

PHFetchResult *fr = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];

PHImageManager *manager = [PHImageManager defaultManager];
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
__block int i = 0;
for (PHAsset *result in fr)
{

    [manager requestImageForAsset:result targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *image, NSDictionary *info) {
        NSLog(@"%d", i);
        i++;
    }];
}

例外は EXC_BAD_ACCESS (コード = 1、アドレス = 0x0) を読み取ります。これについて正しい方向に私を向ける助けは非常に高く評価されます.

4

2 に答える 2

1

これでループを閉じます。for ループが完了するまでイメージは解放されないため、ループの各反復後に @autoreleasepool を配置してプールを空にする必要があります。

PHFetchResult *fr = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
PHImageManager *manager = [PHImageManager defaultManager];
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
__block int i = 0;
for (PHAsset *result in fr)
{
    @autoreleasepool {
    [manager requestImageForAsset:result targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *image, NSDictionary *info) {
            NSLog(@"%d", i);
            i++;
        }];
    }
}
于 2015-09-24T02:22:48.440 に答える