【问题标题】:CGImageRelease: [Not A Type release]: message sent to deallocated instanceCGImageRelease: [Not A Type release]: 消息发送到释放的实例
【发布时间】:2012-03-23 09:43:31
【问题描述】:

我在代码“CGImageRelease(imageToSave);”的最后一行收到此错误“[Not A Type release]: message sent to deallocated instance”。请解释为什么以及我需要使用什么来修复它。我正在使用 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);
}];

【问题讨论】:

标签: iphone xcode memory-management cgimage


【解决方案1】:

比某人告诉你的还要糟糕:

我想说,当您在 else 块 中定义 uiImageToSave 时,您使用 imageToSave 创建的引用在 else 之外无效块 - 所以在你的代码中使用 imageToSave 只是偶然的,只要内存没有被覆盖。

如上所述,[UIImage CGImage] 调用只为您提供图像数据的引用,它不会复制或保留它 - 所以您可以不要自己释放它,它会在 UIImage 不再存在时自动释放 - 在您的情况下,这只是您进行引用后的一行。

更新:

原始帖子中的代码已调整 - uiImageToSave 现在定义在正确的位置(如果有人想知道我的评论现在不再适合原始帖子:-)。

【讨论】:

  • 这是有道理的,并且更改有效。我已经更新了代码。谢谢,也感谢@someone0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多