所以我一直在使用核心图像在图像上应用过滤器,一切都很好,除非我尝试一遍又一遍地应用相同的过滤器应用程序只是退出,我猜它是内存泄漏。
代码如下:
-(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 类的一个方法
最佳答案
您在调用 release
之前将变量设置为 nil,因此 release
无效。但是无论如何你都不应该发布大部分内容。你只需要释放你创建的对象(我希望下面的列表是完整的):
- 由以
alloc
、init
、copy
、new
开头的方法返回的 Objective-C 对象/li> - 由以
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
– 您创建它,您释放它。
关于ios - 使用 Core 图像过滤时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11222825/