在iOS开发中,通过 UIImagePickerController 获取系统相册中的照片的 URL 并不非常的直观。
StackOverFlow 上面的相关问题基本都指向了下面这个方法:
示例代码
即,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 的唯一途径。所以二者都必不可少。