我在代码“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);
}];
甚至比某人告诉你的更糟糕:
我想说正如你定义的那样ui图像保存 in the 否则块,您创建的参考图像保存在 else 块之外无效 - 因此只要内存尚未被覆盖,代码中对 imageToSave 的任何使用都只是偶然。
正如所说,[UI图像CG图像]打电话只会给你一个参考对于图像数据,它不会复制或保留它 - 所以你不能自己释放它,当 UIImage 不再存在时它会自动释放 - 在你的情况下,这只是你进行引用后的一行。
UPDATE:
原始帖子中的代码已调整 - uiImageToSave 现在定义在正确的位置(如果有人想知道我的评论现在不再真正适合原始帖子了:-)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)