许多图像请求后PHImageManager崩溃

时间:2014-11-12 00:00:28

标签: ios ios8 photokit phasset

我正在尝试使用PHAsset抓取所有用户PHAssetMediaTypeImage,然后遍历它们,一次获得相应的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)。任何有助于我指明正确方向的帮助都将受到极大的赞赏。

2 个答案:

答案 0 :(得分:0)

关闭此循环。在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++;
        }];
    }
}

答案 1 :(得分: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选项。)

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