我有一种将照片保存到用户照片库的方法。第一次将照片保存到库时,此代码可以正常工作,但如果您尝试再次保存,则应用程序将崩溃。
以下是方法:
- (void)saveToLibray
{
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
// Request to save the image to camera roll
[library writeImageToSavedPhotosAlbum:[self.image CGImage] orientation:(ALAssetOrientation)[self.image imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:nil message:@"Could not save photo to your library. Please enable Halfsies in Settings > Privacy > Photos." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
CGImageRelease([self.image CGImage]);
} else if (!error) {
UIAlertView *librarySaveSuccessAlertView = [[UIAlertView alloc]initWithTitle:@"Success!" message:@"Your finished halfsie was successfully saved to your photo library!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[librarySaveSuccessAlertView show];
CGImageRelease([self.image CGImage]);
}
}];
}
我已确保释放CGImage
,我也在等待librarySaveSuccessAlertView
在屏幕上显示,点击确定按钮(cancelButtonTitle
),然后我尝试保存第二次。
第二次,应用程序总是崩溃。
这是否发生是因为图书馆可以检测到重复的照片,还是其他的?
编辑:崩溃详情
在应用崩溃后突出显示为绿色的行上,它显示:
Thread 1: EXC_BAD_ACCESS(code=1, address=0x657471ef)
编辑2:好的,所以我现在意识到这很可能是因为我试图向已发布的对象发送消息。我对如何处理这件事很困惑。即使我发布了CGImage
的{{1}}数据,我仍然可以在第二次保存时再次访问它吗?
答案 0 :(得分:1)
正如您已经怀疑(做得好),问题就出在这一行:
CGImageRelease([self.image CGImage])
当且仅当您调用Create
或Copy
方法获取它时,才需要释放CG类型对象。例如,您可能通过调用函数CGImageCreate()
获得了此CGImage。你这里没有做过类似的事情,所以这不是你发布的对象。所以简单地删除这些行,停止不正确的内存管理,一切都会好的。