CGImageRelease:[Not A Type release]:发送给deallocated实例的消息

时间:2012-03-05 22:08:09

标签: iphone xcode memory-management cgimage

我收到此错误“[Not A Type release]:在最后一行代码”CGImageRelease(imageToSave);“上发送给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);
}];

1 个答案:

答案 0 :(得分:4)

甚至比某人告诉你的更糟糕:

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

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

更新:

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