CGImageRelease: [не релиз типа]: сообщение отправлено освобожденному экземпляру - PullRequest
1 голос
/ 06 марта 2012

Я получаю эту ошибку "[Not A Type release]: сообщение отправлено на освобожденный экземпляр" в последней строке кода "CGImageRelease (imageToSave);". Пожалуйста, объясните, почему и что мне нужно использовать, чтобы это исправить. Я использую ARC, но я не думаю, что это относится к объектам CG. Я обновил код с предложенными ответами после тестирования, чтобы они работали.

CGImageRef imageToSave;
UIImage *uiImageToSave = [[UIImage alloc] init];
if (sender == nil) {
    imageToSave = [originalImage CGImage];
} else {
    uiImageToSave = [self addTitleBlock:annotatedImage];
    imageToSave = [uiImageToSave CGImage];
}
[library writeImageToSavedPhotosAlbum:imageToSave metadata:imageMetadata completionBlock:^(NSURL *assetURL,NSError *error){
    [saveAlertView dismissWithClickedButtonIndex:0 animated:YES]; 
    [activityIndicator stopAnimating];
    [activityIndicator removeFromSuperview];
    if(error == nil) {
        if (sender != nil) {
            [self setToolbarItems:viewingToolbarItems animated:YES];
            [UIView beginAnimations:@"savePhoto" context:NULL]; 
            [UIView setAnimationTransition:PHOTO_SAVE forView:pictureView cache:YES]; 
            [UIView setAnimationDuration:0.5f];
            [UIView setAnimationDelay:0.0f];
            [UIView setAnimationPosition:CGPointMake(45, 430)];
            [splashScreen setHidden:NO];
            [imageView setHidden:YES];
            [sampleImageView setHidden:YES];
            [colorImageView setHidden:YES];
            [UIView commitAnimations];
        } else {
            [saveButton setEnabled:YES];
            [cancelButton setEnabled:YES];
        }
    } else {
          if (sender != nil) {
             saveAlertView=[[UIAlertView alloc] initWithTitle:nil message:@"Image Save Failed!" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
         } else {
             saveAlertView=[[UIAlertView alloc] initWithTitle:nil message:@"Original Image Save Failed!" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
         }
        [saveAlertView show];
        [saveButton setEnabled:YES];
        [cancelButton setEnabled:YES];
    }
    // CGImageRelease(imageToSave);
}];

1 Ответ

4 голосов
/ 06 марта 2012

Еще хуже, чем то, что вам говорит кто-то0:

Я бы сказал, как вы определили свой uiImageToSave в блоке else , ссылка, которую вы создали с помощью imageToSave недопустим вне блока else - поэтому любое использование imageToSave в вашем коде просто работает случайно, если память еще не перезаписана.

И, как уже было сказано, [UIImage CGImage] вызов только дает вам ссылку на данные изображения, он не копирует и не сохраняет их - поэтому вы не можете выпустить его самостоятельно, он будет выпущен автоматически, когдаUIImage перестает существовать - в вашем случае это всего одна строка после того, как вы сделаете ссылку.

ОБНОВЛЕНИЕ:

Код в исходном сообщении скорректирован - теперь uiImageToSave определен справаместо (просто если кто-то задается вопросом о моем комментарии, который больше не соответствует оригинальной публикации: -).

...