使用 ARC GPUImage 的内存泄漏

Memory leak using ARC 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 张图片后,应用程序崩溃了。如果我做错了什么,请告诉我。任何帮助将不胜感激。

首先,我建议 运行通过静态分析器("Analyze" 在 Xcode 的 "Product" 菜单上,或者按 shift-command-B),这对于识别 Objective-C 代码中的问题很有用。在继续之前,请确保您有一份来自分析仪的健康证明。使用 ARC,这里可能不会有太多问题,但值得检查,以确保。

其次,当您收到泄漏报告时,这不一定是导致泄漏的原因。它只是向您展示泄漏对象的最初创建位置,这样您就可以检查您的代码并找出该特定对象泄漏的原因。例如,我 运行 通过 "Leaks" 举了一个例子,它引导我进入这个例程:

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

但是当我 运行 应用程序(不是通过 Instruments,而是 运行 它在调试器中)并点击 "Debug memory graph" 按钮时,,我然后可以点击我应该在左侧面板中释放的对象,我现在可以看到哪个对象正在维护强引用。在这种情况下,我可以看到我不小心建立的强引用循环:

有了这些信息,我可以追踪这些强引用的建立位置,并找出它们仍然存在的原因。或者,在这个例子中,我会追查为什么我有一个强大的引用循环并找出哪些引用需要 weak.