在块内实例化ALAssetsLibrary会引发错误访问

时间:2012-04-03 08:25:17

标签: cocoa-touch avfoundation alassetslibrary image-capture

我将项目转换为arc,现在,当我实例化一个新的资产库时,它会抛出一个错误的访问错误。在ARC之前没有问题。

有什么建议吗?

[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:stillImageConnection
                                                   completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
{
    if (error) {
        NSLog(@"Take picture failed");
    }
    else 
    {
        NSData *jpegData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
        CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, 
                                                                    imageDataSampleBuffer, 
                                                                    kCMAttachmentMode_ShouldPropagate);
        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
        [library writeImageDataToSavedPhotosAlbum:jpegData 
                                         metadata:(__bridge_transfer id)attachments
                                  completionBlock:^(NSURL *assetURL, NSError *error) {
                                      if (error) {
                                          NSLog(@"Save to camera roll failed");
                                      }
                                  }];

        if (attachments)
            CFRelease(attachments);
    }
}];

2 个答案:

答案 0 :(得分:1)

请注意,您应该只在应用程序的整个生命周期中初始化assetlibrary一次。所以你应该例如在appdelegate或其他单身人士中执行此操作。你的代码似乎有风险资产库被多次初始化。

干杯,

亨德里克

答案 1 :(得分:0)

有时候生活会如此艰难。在ARC之前,我不必保留CFDictionaryRef。所以添加CFRetain(附件);初始化附件后删除了错误的访问权限。

干杯, tubtub