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 теперь определен в нужном месте (просто если кто-то задается вопросом о моем комментарии, который больше не соответствует исходному сообщению:-).