3

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

这是代码:

-(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 类的一个方法

4

1 回答 1

3

您在调用之前将变量设置为 nil release,因此release没有效果。但是无论如何,您不应该发布大部分内容。你只需要释放你创建的对象(我希望下面的列表是完整的):

  • alloc以, init, copy,开头的方法返回的 Objective-C 对象new
  • 由以 开头的 Objective-C 方法create或由包含Create或的函数返回的基础对象Copy

删除这些行应该没问题:

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

你需要保留这条线CGImageRelease(cgimg);,因为用于获取的方法cgimg包含create- 你创建它,你释放它。

于 2012-06-27T09:34:46.730 回答