使用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的对象(我希望以下列表已完成):
- 由
alloc
,init
,copy
,new
开始的方法返回的Objective-C对象 - 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
– 你创build它,你释放它。