Objective c 使用AlassetLibrary assetForURL:resultBlock:failureBlock的EXC_BAD_访问错误:
我试图从用户选择的图像中读取EXIF数据。我正在用图书馆来做这个。到目前为止,我已经设法获得了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 我一直想弄明白,但每次我似乎都走到了死胡
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];
}
}