1

嗨,在我的应用程序中,我有一个函数可以获取当前视图的图像并将其转换为模糊图像,然后将其添加到 current.view。尽管我使用 [remove from superview] 删除了视图,但内存仍然很高。我正在使用核心图形并将所有 UI 图像设置为零。

我确实收到了内存泄漏警告在此处输入图像描述

-(void)burImage
{
    //Get a screen capture from the current view.
    UIGraphicsBeginImageContext(CGSizeMake(320, 450));
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //Blur the image
    CIImage *blurImg = [CIImage imageWithCGImage:viewImg.CGImage];

    CGAffineTransform transform = CGAffineTransformIdentity;
    CIFilter *clampFilter = [CIFilter filterWithName:@"CIAffineClamp"];
    [clampFilter setValue:blurImg forKey:@"inputImage"];
    [clampFilter setValue:[NSValue valueWithBytes:&transform objCType:@encode(CGAffineTransform)] forKey:@"inputTransform"];

    CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"];
    [gaussianBlurFilter setValue:clampFilter.outputImage forKey: @"inputImage"];
    [gaussianBlurFilter setValue:[NSNumber numberWithFloat:22.0f] forKey:@"inputRadius"];

    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgImg = [context createCGImage:gaussianBlurFilter.outputImage fromRect:[blurImg extent]];
    UIImage *outputImg = [UIImage imageWithCGImage:cgImg];

    //Add UIImageView to current view.
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 450)];
    [imgView setTag:1109];

    imgView.image = outputImg;
    [imgView setTag:1108];

    gaussianBlurFilter = nil;
    outputImg = nil;
    blurImg = nil;

    viewImg = nil;
    [self.view addSubview:imgView];
    UIGraphicsEndImageContext();
}
4

1 回答 1

1

静态分析器(Xcode“产品”菜单上的“分析”)通知您CGImageRelease(cgImg)在方法结束时缺少所需的内容。如果您有一个从名称中带有“创建”或“复制”的方法/函数返回的核心基础对象,则您有责任释放它。

顺便说一句,如果您点击在此处输入图像描述图标(一次在空白处,然后再次点击出现在错误消息中的版本),它将显示更多信息:

在此处输入图像描述

这有助于追溯问题的起源,在本例中是调用createCGImage. 如果您查看 的文档createCGImage它会确认此诊断,并报告:

返回值

石英 2D 图像。当您不再需要返回的图像时,您有责任释放它。

有关释放 Core Foundation 对象的一般建议,请参阅 Core Foundation的内存管理编程指南中的创建规则。

于 2013-10-01T20:15:14.753 回答