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

所以我一直在使用核心图像在图像上应用滤镜,除了当我尝试重复应用相同的滤镜,应用程序退出时,一切都很好,我猜测它是内存泄漏。

代码如下:

-(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是我创build的Filter类的一个方法

您在调用release之前将variables设置为零,因此release没有任何影响。 但是你不应该释放大部分东西。 您只需要释放您创build的对象(我希望以下列表已完成):

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

删除这些行,它应该是罚款:

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

你需要保持行CGImageRelease(cgimg); 因为用来获取cgimg的方法包含create – 你创build它,你释放它。