0

사용자가 선택한 이미지에서 EXIF ​​데이터를 읽으려고합니다. 나는 이것을 위해 ALAssetLibrary를 사용하고있다. 지금까지 나는 assetForURL:resultBlock:failureBlock: 메소드에 필요한 참조 URL을 얻을 수 있었지만 참조 URL을 가지고 무엇인가하려고하면 EXC_BAD_ACCESS 오류가 발생합니다. 나는이 문제를 내려고 노력했습니다ALAssetsLibrary assetForURL을 사용하는 EXC_BAD_ACCESS 오류 : resultBlock : failureBlock :

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

: 오른쪽 (올바른, 내가 아는 한) 문자열의 결과를 사용하기 전에 URL의

NSLog, 나가지만, 나는 매번 막 다른 골목을 치는 것처럼 보인다. 나는 Objective-C가 처음 인데요, 그래서 제 코드를 비판 해주십시오.

코드 (지금까지 전체 클래스에서,하지만 난이 충분해야한다고 생각) :

//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]; 
    } 

} 

답변

3

EXC_BAD_ACCESS 가장 자주 (포인터를 매달려)를 통해 출시 된 객체의 결과입니다. 라이브러리가 비동기 적으로 작동하면 readExifDataFromSelectedImage: 메서드가 반환 된 후에 블록이 실행되므로 imageRefURL이이 시점에서 이미 할당이 해제되었을 수 있습니다. 애셋을 요청하기 전에 URL을 retain으로 시도하고 성공 및 실패 블록에 애셋을 release 시도하십시오.

+0

환호성, 저의 초기 오류를 해결했습니다. 그러나 readExifFromSelectedImage 메서드를 호출 할 때 동일한 (EXC_BAD_ACCES) 오류가 발생 했습니까 (URL을 파싱했는지 상관없이 하드 코드 된 [NSURL URLWithString : @ "assets-library : //asset/asset.JPG? id = 1000000003 & ext = JPG "] [self.report] 객체는 괜찮습니다. 다른 방법은 오류없이 제대로 작동합니다. 미리 감사드립니다 :) – Uxxish

+0

흠, myAssetLib이 정의되지 않은 것 같습니다. 변수를 선언했지만 값을 지정하지 마십시오 ... – omz

+0

나는 그것을 간과 한 방법을 믿을 수 없습니다. 무리 감사! 이제 완벽하게 작동합니다! – Uxxish