5

我试图抓住所有用户PHAssetPHAssetMediaTypeImage然后遍历他们,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(代码=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 回答
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 选项时,照片会为资源提供可用的最大图像,而无需缩放或裁剪。(也就是说,它忽略了 resizeMode 选项。)

所以,这就解释了问题。我相信如果它是单个图像,它应该不是问题,但如果它是多个图像,则设备会耗尽内存。

于 2016-11-08T19:29:18.493 回答