CGImageRelease: [не релиз типа]: сообщение отправлено освобожденному экземпляру

Я получаю эту ошибку "[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 ответ

Решение

Даже хуже, чем то, что тебе кто-то говорит:

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

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

ОБНОВИТЬ:

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

Другие вопросы по тегам