我知道之前已经问过这个问题,但似乎没有任何效果。
我有一个静态方法,使用CIImage
和CGIImage
返回过滤后的图像,我在RayWenderlich.com上使用了示例并将其更改为返回UIImage而不是直接将其设置为UIImageView。
我的问题是CGImageRef cgimg
永远不会被释放。这导致了相当快的内存泄漏。我究竟做错了什么?
+ (UIImage *)image:(UIImage *)image withFilterName:(NSString *)filterName
{
if (!image)
return nil;
@autoreleasepool {
CIImage *beginImage = [[CIImage alloc] initWithCGImage:image.CGImage];
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIPhotoEffectProcess"]
[filter setValue:beginImage forKey:kCIInputImageKey];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImage = [UIImage imageWithCGImage:cgimg];
CGImageRelease(cgimg);
return newImage;
}
}
看起来像cgimg
正在被释放。我认为你的意思是CGImage
没有被解除分配。你不会指望它,因为你把它传递给UIImage
,它可能会保留它。
很可能你后来泄漏了UIImage
(或者当你不指的时候保持它,这类似于泄漏)。我会审核您使用的代码并释放UIImage
,而CGImageRef
可能会自行处理。
试试这个......
+ (UIImage *)image:(UIImage *)image withFilterName:(NSString *)filterName
{
if (!image)
return nil;
CIImage *beginImage = [[CIImage alloc] initWithCGImage:image.CGImage];
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIPhotoEffectProcess"];
[filter setValue:beginImage forKey:kCIInputImageKey];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImage = [UIImage imageWithCGImage:cgimg];
beginImage = nil;
context = nil;
filter = nil;
outputImage = nil;
CGImageRelease(cgimg);
return newImage;
}