PHImageManager在请求多张图片后崩溃

5

我想获取所有带有 PHAssetMediaTypeImage 的用户 PHAsset,并逐个迭代获取相应的 UIImages。我在 iPhone 5 上有大约 2k 张照片,但是在迭代了其中的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(code=1,address=0x0)。任何指向正确方向的帮助都将不胜感激。

如果您再拍一张照片,它是否仍然在587处失败,还是在588处崩溃?为什么您要这样做?如果您提供更多上下文,我们可能能够提供另一种方法,因为这似乎不是最佳方法。 - Josh Heald
1
@Stephen 你解决了吗?我也遇到了同样的问题,很想听听你发现了什么。如果你没有答案,发布崩溃线程的堆栈跟踪可能会有用。 - Hugo
我无法弄清楚它。我已经暂停了那个项目一段时间,但我认为当我回到它时,我会采取不同的方法并批量处理图像,除非苹果在那时修复了这个错误。 - Stephen Mueller
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++;
        }];
    }
}

0
问题出在这行代码中。
   PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFill, options: nil, resultHandler: {(result, info) in cell.setThumbnailImage(result)
    })

参数targetSize传递了PHImageManagerMaximumSize的值,这是问题的罪魁祸首。我将其更改为lCgSizelCgSize = CGSizeMake(105, 105); 解决了这个问题。

根据文档PHImageManagerMaximumSize:

当您使用PHImageManagerMaximumSize选项时,Photos会提供可用于该资源的最大图像,而不需要缩放或裁剪 (也就是说,它忽略了resizeMode选项)。

因此,这解释了问题所在。我相信如果只有单个图像,这应该不是一个问题,但如果有许多图像,设备将耗尽内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接