繁体   English   中英

UIGraphicsContext内存泄漏

[英]UIGraphicsContext memory leak

嗨,在我的应用程序中,我有一个功能,可以获取当前视图的图像并将其转换为模糊图像,然后将其添加到current.view中。 尽管我使用[从超级视图中删除]删除了视图,但它的内存仍然很高。 我正在使用核心图形,并将所有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();
}

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

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

在此处输入图片说明

这有助于追溯问题的createCGImage ,在本例中为createCGImage的调用。 如果查看createCGImage文档 ,它将确认此诊断,并报告:

返回值

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM