【iOS开发】Connection to assetsd was interrupted or assetsd died

在iOS开发中,通过 UIImagePickerController 获取系统相册中的照片的 URL 并不非常的直观。

* 上面的相关问题基本都指向了下面这个方法:

示例代码

即,import AssetsLibrary 之后,在 imagePickerController 的方法中,通过 ALAssetsLibrary 的 writeImageToSavedPhotosAlbum 方法,在闭包中获取assetURL,而值得注意的是,有不少人在这里出现了内存管理的问题(循环引用),最终导致控制台输出如下。

报错信息

Connection to assetsd was interrupted or assetsd died

这个信息出现,基本就可以确定是内存管理出了问题,但是具体原因就视情况而定了。

有人是通过加入 autoreleasepool 或者用 GCD 解决的问题,而我在尝试无果之后发现了另一个非常隐蔽的原因:

正确代码
错误代码

这里虽然我们是以获取URL为目的,但是把选中的图片写入系统相册也是必须的,而这一步的 CGImage 参数必须由 UIImage.CGImage 获得,而不能是用 as! 进行强制类型转换,当然更不能是nil。

在 writeImageToSavedPhotosAlbum 这个方法中,CGImage 参数和最后的闭包参数都是可以写成nil并通过编译的,但是前者写成nil会造成这个方法不能被成功执行,后面的闭包是我们获取 assetURL 的唯一途径。所以二者都必不可少。

上一篇:2021 一整年,技术圈都发生了什么?


下一篇:一文看懂【2021 阿里云峰会】现场所有重磅技术发布