使用 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
.
我正在尝试对另一个 .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
.