Ios 应用核心图像过滤器时处理内存警告

Ios 应用核心图像过滤器时处理内存警告,ios,automatic-ref-counting,core-image,Ios,Automatic Ref Counting,Core Image,我使用下面的代码应用图像过滤器。这在缩小的图像上工作得很好。 但当我在全分辨率图像上应用2个以上的过滤器时,应用程序崩溃了。接收到内存警告 当我打开“分配”工具时,我看到CFData(存储)占用了程序使用的大部分内存。 当我在一个全分辨率图像上应用2个以上的过滤器时,“总字节数”将达到54MB。当我用眼睛观察这些数字时,“活动字节”似乎不会超过12MB,但峰值显示,活动字节也会达到这个数字并返回 我哪里做错了 - (UIImage *)editImage:(UIImage *)imageToBe

我使用下面的代码应用图像过滤器。这在缩小的图像上工作得很好。 但当我在全分辨率图像上应用2个以上的过滤器时,应用程序崩溃了。接收到内存警告

当我打开“分配”工具时,我看到CFData(存储)占用了程序使用的大部分内存。 当我在一个全分辨率图像上应用2个以上的过滤器时,“总字节数”将达到54MB。当我用眼睛观察这些数字时,“活动字节”似乎不会超过12MB,但峰值显示,活动字节也会达到这个数字并返回

我哪里做错了

- (UIImage *)editImage:(UIImage *)imageToBeEdited tintValue:(float)tint 
{ 
CIImage *image = [[CIImage alloc] initWithImage:imageToBeEdited]; 
NSLog(@"in edit Image:\ncheck image: %@\ncheck value:%f", image, tint); 

[tintFilter setValue:image forKey:kCIInputImageKey]; 
[tintFilter setValue:[NSNumber numberWithFloat:tint] forKey:@"inputAngle"]; 

CIImage *outputImage = [tintFilter outputImage]; 
NSLog(@"check output image: %@", outputImage); 
return [self completeEditingUsingOutputImage:outputImage]; 
} 

- (UIImage *)completeEditingUsingOutputImage:(CIImage *)outputImage 
{ 
CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage.extent]; 
NSLog(@"check cgimg: %@", cgimg); 
UIImage *newImage = [UIImage imageWithCGImage:cgimg]; 
NSLog(@"check newImge: %@", newImage); 
CGImageRelease(cgimg); 
return newImage; 
} 
编辑: 我还尝试将cgimg设置为零。没有帮助。 我尝试将上下文声明和定义放在第二个函数中。没有帮助。 我试图在函数中移动过滤器的声明和定义,但没有帮助

阿尔索克拉什发生在

CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage.extent]; 

我正在制作的cgimg占用了大部分内存空间,没有被释放

我观察到,使用较小的值调用文件服务器会将CFData(store)内存值恢复为samller值,从而避免崩溃

所以我应用过滤器,然后调用图像为“nil”的相同过滤器。在应用所有4个过滤器后,这会将内存从48MB恢复到484kb左右

此外,我将在后台线程而不是主线程上应用此过滤器。再次应用于主线程会导致崩溃。可能它没有足够的时间释放内存。我不知道。
但这些事情现在进展顺利。

我想这和我之前写的一样。我找到了解决这个问题的办法。实际上并没有解决它。我在下面发布它。您使用outputImage.extent我使用outputImage extent…。我在outputImage.extentI中遇到错误。我没有收到任何错误。[输出范围]也意味着同样的事情。看到代码了吗。。。。你使用的是模拟器还是设备?都一样。output.extent用于获取属性,“extent”成为获取名为“extent”的属性的getter方法。
// where is your input filter name like this:

[tintFilter setValue:image forKey:@"CIHueAdjust"];

// I think you have a mistake in outputImage.extent. You just write this 

CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage extent];