所以我一直在使用核心图像在图像上应用过滤器,一切都很好,除非我尝试一遍又一遍地应用相同的过滤器,应用程序就退出了,我猜它是内存泄漏。
以下是代码:
-(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类的方法
答案 0 :(得分:3)
在致电release
之前,您将变量设置为nil,因此release
无效。但是你不应该释放大部分的东西。您只需要发布创建的对象(我希望以下列表已完成):
alloc
,init
,copy
,new
create
开头的Objective-C方法或包含Create
或Copy
的函数返回的基础对象。删除这些行,应该没问题:
beginImage = nil;
context = nil;
filter = nil;
outputImage = nil;
cgimg = nil;
[beginImage release];
[context release];
[filter release];
[outputImage release];
您需要保留第CGImageRelease(cgimg);
行,因为用于获取cgimg
的方法包含create
- 您创建它,然后释放它。