我正在尝试使用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)。任何有助于我指明正确方向的帮助都将受到极大的赞赏。
答案 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的值,这是罪魁祸首。我将其更改为lCgSize
,lCgSize = CGSizeMake(105, 105);
解决了问题。
根据文档PHImageManagerMaximumSize
使用PHImageManagerMaximumSize选项时,Photos提供了 可用于资产的最大图像,无需缩放或裁剪。 (也就是说,它会忽略resizeMode选项。)
所以,这解释了这个问题。我相信如果它是单个图像,它不应该是一个问题,但如果它是很多图像,设备将耗尽内存。