使用ARC GPUImage进行内存泄漏

时间:2017-05-15 19:39:03

标签: ios objective-c memory-leaks automatic-ref-counting gpuimage

我正在尝试对另一个.m文件中的图像进行处理。目前以下是我的代码。我有一个全局的NSMutableArray来存储两个UIImages并处理这两个。每次用户单击一个按钮时,它会将两张图片存储在全局数组中处理它们然后删除元素。我正在使用ARC,所以我不需要发布。

@implementation
NSMutableArray * imagesArray;
ImageProcessor *imageProcessor;
...

- (void)viewDidLoad {
imagesArray = [[NSMutableArray alloc] init];
imageProcessor = [[ImageProcessor alloc] init];
//some other code
}

-(UIImage*)processImages{//process images using GPUImage
    UIImage *firstImg = [[imagesArray objectAtIndex:1] copy];
    UIImage *secImg = [[imagesArray objectAtIndex:0] copy];
    UIImage *processedImage = [imageProcessor flashSubtract:firstImg : secImg];
    UIImage *dividedImage = [imageProcessor referenceDivide:processedImage];
//    [self uploadDropbox:UIImagePNGRepresentation(processedImage) : @"Output.png"];//try to save tiff files
    //using ARC, no explicit memory releasing required
    NSLog(@"image processed!");
    [imagesArray removeAllObjects];
    return dividedImage;
}

ImageProcessor.m:

#import "ImageProcessor.h"

@interface ImageProcessor ()

@end

@implementation ImageProcessor

GPUImageSubtractBlendFilter *subFilter;
GPUImageDivideBlendFilter* divFilter;

-(id)init {
    self = [super init];
    //initialize filters
    subFilter = [[GPUImageSubtractBlendFilter alloc] init];
    divFilter = [[GPUImageDivideBlendFilter alloc] init];
    return self;
}

-(UIImage*)flashSubtract:(UIImage*) image1 : (UIImage*) image2{
    UIImage *processedImage;
//    @autoreleasepool {

    //CAUSING MEMORY ISSUE
    GPUImagePicture *img1 = [[GPUImagePicture alloc] initWithImage:image1];//image with flash
    GPUImagePicture *img2 = [[GPUImagePicture alloc] initWithImage:image2];//image without flash
    //MEMORY ISSUE END

    [img1 addTarget:subFilter];
    [img2 addTarget:subFilter];

    [img1 processImage];
    [img2 processImage];
    [subFilter useNextFrameForImageCapture];
    processedImage = [subFilter imageFromCurrentFramebuffer];

//    }

    //consider modifications to filter possibly?


    return processedImage;
}
@end

我遇到内存泄漏问题,在[imageProcessor flashSubtract]之后它没有释放内存。内存使用量不断增长,大约30张图片后,应用程序崩溃。如果我做错了,请告诉我。任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:2)

首先,我建议您通过静态分析器运行代码(&#34;分析&#34;在Xcode&#34;产品&#34;菜单上,或按 shift < / kbd> - 命令 - B ),它可用于识别Objective-C代码中的问题。在继续之前,请确保您从分析仪获得了清洁的健康状况。使用ARC,这里可能没有太多问题,但值得检查,只是为了确保。

其次,当您收到泄漏报告时,不一定是导致泄漏的原因。它只是向您展示泄漏对象最初创建的位置,因此您可以查看代码并找出泄漏对象的原因。例如,我通过&#34; Leaks&#34;它指导我这个例程:

enter image description here

这并不是很有启发性。很高兴知道泄露了什么,但我宁愿找出泄漏物体泄漏的原因,而不仅仅是泄漏物体的最初分配位置。

但是当我运行应用程序时(不是通过Instruments,而只是在调试器中运行它)并点击了&#34;调试内存图&#34;按钮,enter image description here,然后我可以点击应该在左侧面板中释放的对象,现在我可以看到哪个对象保持强引用。在这种情况下,我可以看到我偶然建立的强大的参考周期:

enter image description here

有了这些信息,我可以追踪这些强大的参考资料的确定位置,并弄清楚它们为何仍然存在。或者,在这个例子中,我将追踪为什么我有一个强大的参考周期,并找出哪些参考需要weak