使用ALAssetsLibrary多次将照片保存到库会导致崩溃

时间:2014-07-24 18:42:32

标签: ios alassetslibrary

我有一种将照片保存到用户照片库的方法。第一次将照片保存到库时,此代码可以正常工作,但如果您尝试再次保存,则应用程序将崩溃。

以下是方法:

- (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}}数据,我仍然可以在第二次保存时再次访问它吗?

1 个答案:

答案 0 :(得分:1)

正如您已经怀疑(做得好),问题就出在这一行:

CGImageRelease([self.image CGImage])

当且仅当您调用CreateCopy方法获取它时,才需要释放CG类型对象。例如,您可能通过调用函数CGImageCreate()获得了此CGImage。你这里没有做过类似的事情,所以这不是你发布的对象。所以简单地删除这些行,停止不正确的内存管理,一切都会好的。