Ошибка EXC_BAD_ACCESS при использовании ALAssetsLibrary assetForURL: resultBlock: failBlock: - PullRequest
0 голосов
/ 16 мая 2011

Я пытаюсь прочитать данные EXIF ​​из изображения, выбранного пользователем. Я использую ALAssetLibrary для этого. До сих пор мне удавалось получить ссылочный URL-адрес, необходимый для метода assetForURL:resultBlock:failureBlock:, но когда я пытаюсь что-либо сделать с ссылочным URL-адресом, я получаю ошибку EXC_BAD_ACCESS.

NSLog URL-адреса, непосредственно перед его использованием, приводит к (правильной, насколько мне известно) строке:

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

Я пытался это выяснить, но, похоже, каждый раз захожу в тупик. Я должен признать, что я новичок в 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];
    }

}

1 Ответ

3 голосов
/ 16 мая 2011

EXC_BAD_ACCESS чаще всего является результатом перевыпущенного объекта (висячий указатель). Поскольку библиотека работает асинхронно, ваш блок выполняется после возврата метода readExifDataFromSelectedImage:, поэтому imageRefURL, вероятно, уже освобожден на этом этапе. Попробуйте retain URL-адрес перед запросом ресурса и release его в блоках успеха и сбоя.

...