Objective c 使用AlassetLibrary assetForURL:resultBlock:failureBlock的EXC_BAD_访问错误:

Objective c 使用AlassetLibrary assetForURL:resultBlock:failureBlock的EXC_BAD_访问错误:,objective-c,cocoa-touch,ios,memory-management,alassetslibrary,Objective C,Cocoa Touch,Ios,Memory Management,Alassetslibrary,我试图从用户选择的图像中读取EXIF数据。我正在用图书馆来做这个。到目前为止,我已经设法获得了assetForURL:resultBlock:failureBlock:方法所需的参考URL,但是当我尝试对参考URL执行任何操作时,我得到了一个EXC\u BAD\u ACCESS错误 在使用URL之前,URL的NSLog,会产生(据我所知是正确的)字符串: 资产-library://asset/asset.JPG?id=1000000003&ext=JPG 我一直想弄明白,但每次我似乎都走到了死胡

我试图从用户选择的图像中读取EXIF数据。我正在用图书馆来做这个。到目前为止,我已经设法获得了
assetForURL:resultBlock:failureBlock:
方法所需的参考URL,但是当我尝试对参考URL执行任何操作时,我得到了一个
EXC\u BAD\u ACCESS
错误

在使用URL之前,URL的
NSLog
,会产生(据我所知是正确的)字符串:

资产-library://asset/asset.JPG?id=1000000003&ext=JPG

我一直想弄明白,但每次我似乎都走到了死胡同。我必须承认我对Objective-C一般来说是新手,所以请随意批评我的代码

代码(远不是完整的类,但我认为应该足够了):


EXC\u BAD\u访问
通常是过度释放对象(悬空指针)的结果。由于库是异步运行的,所以在返回
readExifDataFromSelectedImage:
方法后,您的块将被执行,因此此时可能已经释放了imageRefURL。在请求资产之前,请尝试
保留该URL,并
在成功和失败块中释放该URL。

执行错误访问
通常是过度释放对象(悬空指针)的结果。由于库是异步运行的,所以在返回
readExifDataFromSelectedImage:
方法后,您的块将被执行,因此此时可能已经释放了imageRefURL。在请求资产之前,请尝试
保留
URL,并
在成功和失败块中释放它。

干杯,这清除了我最初的错误。但是,在调用readExifFromSelectedImage方法时,这是否会产生相同的(EXC_BAD_ACCES)错误(无论我如何解析url,甚至是硬编码的[NSURL URLWithString:@”资产-library://asset/asset.JPG?id=1000000003&ext=JPG“]对此有什么建议吗?[自我报告]对象很好,另一个方法可以正常工作,没有错误。提前感谢:)嗯,看起来myAssetLib没有定义。你声明了变量,但没有给它赋值……难以置信,我竟然忽略了这一点。非常感谢!现在效果很好!干杯,这消除了我最初的错误。但是,在调用readExifFromSelectedImage方法时,这是否会产生相同的(EXC_BAD_ACCES)错误(无论我如何解析url,甚至是硬编码的[NSURL URLWithString:@”资产-library://asset/asset.JPG?id=1000000003&ext=JPG“]对此有什么建议吗?[自我报告]对象很好,另一个方法可以正常工作,没有错误。提前感谢:)嗯,看起来myAssetLib没有定义。你声明了变量,但没有给它赋值……难以置信,我竟然忽略了这一点。非常感谢!现在效果很好!
//Class_X.m

-(void)readExifDataFromSelectedImage:(NSURL *)imageRefURL    
{
    void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset)
    {
       NSLog(@"Test:Succes");
    };

    ALAssetsLibrary *myAssetLib;
    NSLog(@"%@",imageRefURL);
    [myAssetLib assetForURL:imageRefURL
                resultBlock:ALAssetsLibraryAssetForURLResultBlock 
               failureBlock:^(NSError *error){NSLog(@"test:Fail");}];
}

//Class_Y.m
//This  also conforms to the UIImagePickerControllerDelegate And the NavigationControllerDelegate protocols:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    self.referenceURL = [info valueForKey:@"UIImagePickerControllerReferenceURL"];
    NSString *mediaType = [info
                       objectForKey:UIImagePickerControllerMediaType];
    [self dismissModalViewControllerAnimated:YES];
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
        UIImage *selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage];
        imageView.image = selectedImage;
        btnNoPicture.hidden = YES;
        btnSelectPicture.hidden = YES;
        btnTakePicture.hidden = YES;
        imageView.hidden = NO;
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Use this image?" 
                                                        message:@"Are you sure you want to use this image?" 
                                                       delegate:self 
                                              cancelButtonTitle:@"No" 
                                              otherButtonTitles:@"Yes", nil];
        [alert show];
        [alert release];
    }

}


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0)
    {
        //Do not use the selected image.
        imageView.image = nil;
        imageView.hidden = YES;
        //Restart picking process
    }
    else
    {

        // I have an instance variable of type Class_X which i use 
        // throughout this class; let's call this variable "report". 
        // I also have the referenceURL stored as an instance variable.
        [self.report readExifDataFromSelectedImage:self.referenceURL];
    }

}