2012-12-24 91 views
0

在图像上应用GPUImage过滤器时,我遇到了一个奇怪的问题。我试图对图像应用不同的过滤器,但应用10-15个过滤器后,它会给我提示内存,然后崩溃。 这里是代码:GPUImage内存警告

sourcePicture = [[GPUImagePicture alloc] initWithImage:self.m_imageView.image smoothlyScaleOutput:YES]; 

      GPUImageBrightnessFilter *bright=[[GPUImageBrightnessFilter alloc]init]; 
      [bright setBrightness:0.4]; 
      GPUImageFilter *sepiaFilter = bright; 

      [sepiaFilter prepareForImageCapture]; 
      [sepiaFilter forceProcessingAtSize:CGSizeMake(640.0, 480.0)]; // This is now needed to make the filter run at the smaller output size 
      [sourcePicture addTarget:sepiaFilter]; 
      [sourcePicture processImage]; 
      UIImage *sep=[sepiaFilter imageFromCurrentlyProcessedOutputWithOrientation:3]; 

      self.m_imageView.image=sep; 
      [sourcePicture removeAllTargets]; 

如果有人经历过同样的问题,请建议。谢谢

+0

这个应用程序使用ARC吗? – propstm

+0

不,这个程序没有ARC。 – Superdev

回答

1

由于您没有使用ARC,它看起来像你在几个地方泄漏内存。通过不断地分配,而没有释放您创建泄漏的价值。这是一篇关于内存管理的好文章。 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

检查以确保我已注释的那些斑点正在正确释放,然后再次检查,如果您正在添加的15个过滤器中的每一个都有两个潜在的泄漏点,那么您将创建可能为30个泄漏点。

编辑:我也为你添加了两个潜在的修复程序,但要确保你正确地管理你的内存,以确保你在其他地方没有任何问题。

//--Potentially leaking here-- 
sourcePicture = [[GPUImagePicture alloc] initWithImage:self.m_imageView.image smoothlyScaleOutput:YES]; 

//--This may be leaking--  
GPUImageBrightnessFilter *bright=[[GPUImageBrightnessFilter alloc]init];    
[bright setBrightness:0.4]; 

GPUImageFilter *sepiaFilter = bright; 
//--Done using bright, release it; 
[bright release];       
[sepiaFilter prepareForImageCapture]; 
[sepiaFilter forceProcessingAtSize:CGSizeMake(640.0, 480.0)]; // This is now needed to make the filter run at the smaller output size 
[sourcePicture addTarget:sepiaFilter]; 
[sourcePicture processImage]; 
UIImage *sep=[sepiaFilter imageFromCurrentlyProcessedOutputWithOrientation:3]; 

self.m_imageView.image=sep; 
[sourcePicture removeAllTargets]; 
//--potential fix, release sourcePicture if we're done -- 
[sourcePicture release]; 
+3

请注意,如果您在状态下释放'bright',则会导致崩溃。因为它是通过引用'sepiaFilter'分配的,所以后面的访问将引用一个解除分配的对象。您至少需要在上述代码中的'-addTarget:'用法之后移动该版本。 –