PhotoKit:使用 requestImageForAsset 通过 PHImageManagerMaximumSize 获取资产时崩溃 [assetsd 被中断或死亡]

Posted

技术标签:

【中文标题】PhotoKit:使用 requestImageForAsset 通过 PHImageManagerMaximumSize 获取资产时崩溃 [assetsd 被中断或死亡]【英文标题】:PhotoKit: Crash [assetsd was interrupted or died] when using requestImageForAsset to fetch asset with PHImageManagerMaximumSize 【发布时间】:2015-04-30 23:20:07 【问题描述】:

我正在尝试使用 UIPageViewController 显示图像,使用来自苹果的示例代码并将其替换为新的照片工具包:PHAsset https://developer.apple.com/library/ios/samplecode/MyImagePicker/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010135 当我用 PHImageManagerMaximumSize 刷照片时,我发现在 50 张照片之后,应用程序会崩溃并显示“assetsd 中断或死亡”。但是,如果我要求更小的目标尺寸(与屏幕尺寸相同),那么崩溃就不太可能发生了。我想知道这是我的应用程序某处的内存泄漏还是渲染系统有问题?似乎压缩和解压缩使用了很多页面。谁能帮我看看?

- (void)displayImage:(PHAsset*)asset

 [self.imageView removeFromSuperView]
 self.imageView = nil;
 [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:nil resultHandler:^(UIImage *result, NSDictionary *info) 

        self.imageView = [[UIImageView alloc] initWithImage:result];
        self.imageView.contentMode = UIViewContentModeScaleAspectFit;
        // self is a scrollView    
        [self addSubview:self.imageView];
    ];

------登录控制台----------

2015-02-27 22:35:20.613 XXX [2831:145514] ImageViewController,-[ImageViewController didReceiveMemoryWarning] 2015-02-27 22:35:22.111 XXX [2831:145558] 与 assetsd 的连接被中断或 assetsd 死亡

------- 崩溃日志 ---------

免费页面:1361 活动页面:26954 非活动页面:13499 投机页面:40 限制页面:0 可清除页面:0 有线网页:59258 文件支持的页面:11321 匿名页面:29172 压缩:6474001 减压:704086 压缩机尺寸:151510 Compressor 中未压缩的页面:212409 页面大小:16384 最大进程:iGather

进程 姓名 | | CPU时间| rpages|可净化|最近_最大|寿命_max| fds | [原因] | (状态)

assistant_servic 0.485 1451 0 - 4111 50 [vm-pageshortage](守护进程)(空闲) medialibraryd 0.296 1037 0 - 2072 50 [vm-pageshortage](守护进程)(空闲) WirelessRadioMan 0.077 285 0 - 890 50 [vm-pageshortage](守护进程)(空闲) awdd 0.070 402 0 - 1043 50 [vm-pageshortage](守护进程)(空闲) assetsd 0.188 679 0 - 1907 50 [vm-pageshortage](守护进程)(空闲) seld 0.030 193 0 - 696 50 [vm-pageshortage](守护进程) passd 0.243 630 0 - 2384 50 [vm-pageshortage](守护进程) nfcd 0.023 184 0 - 624 50 [vm-pageshortage](守护进程) biometrickitd 0.141 273 0 - 841 50 [vm-pageshortage](守护进程) 调试服务器 0.306 207 0 - 629 50 [vm-pageshortage](守护进程) MobileMail 0.957 1496 0 - 4063 50 [vm-pageshortage](恢复)(连续) lsd 1.213 364 0 - 1032 50 [vm-pageshortage](守护进程) tccd 0.132 238 0 - 593 50 [vm-pageshortage](守护进程) kbd 0.116 344 0 - 1447 50 [vm-pageshortage](守护进程) iGather 3.610 23061 0 - 21099 50 [vm-pageshortage](最前面)(简历) ...

【问题讨论】:

【参考方案1】:

您绝对应该使用Instruments 来确认这一点,但我发现即使使用 ARC,您在处理一批照片时也必须谨慎使用内存。

和您一样,我想为用户提供尽可能高质量的图像,以便他们可以放大并详细检查照片。我在一个网格中显示 N 张照片。我发现即使摆脱对这些资产的所有引用,在加载下一组 N 之前它们也不会被释放。我只需要将内存使用量减半,这样 N * 2 在内存中的短暂转换就不会导致我的应用崩溃。

当然,如果您的内存使用越来越单调,那么您可能确实在代码中的某处对这些图像有幸存的引用。再次,仪器。

【讨论】:

谢谢你的回答,我想我找到了原因。这是因为 PageViewController 创建的视图控制器没有释放。是的,就像你说的,Instruments。

以上是关于PhotoKit:使用 requestImageForAsset 通过 PHImageManagerMaximumSize 获取资产时崩溃 [assetsd 被中断或死亡]的主要内容,如果未能解决你的问题,请参考以下文章

PhotoKit:使用 requestImageForAsset 通过 PHImageManagerMaximumSize 获取资产时崩溃 [assetsd 被中断或死亡]

如何使用 PhotoKit 列出共享的照片流相册

iOS 8、PhotoKit、PHAsset、唯一标识符

PhotoKit:PHFetchOptions 中的 includeAllBurstAssets 不起作用

使用 PhotoKit 在文件夹内创建子文件夹

photoKit不得不说的坑