PHImageManager 在多次图像请求后崩溃

Ste*_*ler 5 ios ios8 photokit phasset

我试图抓住所有用户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++;
    }];
}
Run Code Online (Sandbox Code Playgroud)

异常读取 EXC_BAD_ACCESS(代码=1,地址=0x0)。任何为我指明正确方向的帮助将不胜感激。

Ste*_*ler 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++;
        }];
    }
}
Run Code Online (Sandbox Code Playgroud)