使用Core映像过​​滤时内存泄漏

时间:2012-06-27 09:06:32

标签: ios xcode core-image

所以我一直在使用核心图像在图像上应用过滤器,一切都很好,除非我尝试一遍又一遍地应用相同的过滤器,应用程序就退出了,我猜它是内存泄漏。

以下是代码:

-(UIImage *) applyFilter: (UIImage*) picture
{

    UIImageOrientation originalOrientation = picture.imageOrientation;
    CGFloat originalScale = picture.scale;   


    CIImage *beginImage = [CIImage imageWithCGImage:picture.CGImage];  


    CIContext *context = [CIContext contextWithOptions:nil];

    CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" 
                                  keysAndValues: kCIInputImageKey, beginImage, 
                        @"inputIntensity", [NSNumber numberWithFloat:0.8], nil];

    CIImage *outputImage = [filter outputImage];

    CGImageRef cgimg = 
    [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg scale:originalScale orientation:originalOrientation];

    beginImage = nil;
    context = nil;
    filter = nil;
    outputImage = nil;
    cgimg = nil;
    [beginImage release];
    [context release];
    [filter release];
    [outputImage release];
    //CGImageRelease(CGImageRef) method.
    CGImageRelease(cgimg);

    return newImg;
}

过滤我只是做

UIImage *ima = [self.filter applyFilter:self.imageView.image];
imageView.image = ima ;

applyFilter是我创建的Filter类的方法

1 个答案:

答案 0 :(得分:3)

在致电release之前,您将变量设置为nil,因此release无效。但是你不应该释放大部分的东西。您只需要发布创建的对象(我希望以下列表已完成):

  • allocinitcopynew
  • 开头的方法返回的Objective-C对象
  • create开头的Objective-C方法或包含CreateCopy的函数返回的基础对象。

删除这些行,应该没问题:

beginImage = nil;
context = nil;
filter = nil;
outputImage = nil;
cgimg = nil;
[beginImage release];
[context release];
[filter release];
[outputImage release];

您需要保留第CGImageRelease(cgimg);行,因为用于获取cgimg的方法包含create - 您创建它,然后释放它。