我正在尝试对另一个.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张图片后,应用程序崩溃。如果我做错了,请告诉我。任何帮助都将非常感激。
答案 0 :(得分:2)
首先,我建议您通过静态分析器运行代码(&#34;分析&#34;在Xcode&#34;产品&#34;菜单上,或按 shift < / kbd> - 命令 - B ),它可用于识别Objective-C代码中的问题。在继续之前,请确保您从分析仪获得了清洁的健康状况。使用ARC,这里可能没有太多问题,但值得检查,只是为了确保。
其次,当您收到泄漏报告时,不一定是导致泄漏的原因。它只是向您展示泄漏对象最初创建的位置,因此您可以查看代码并找出泄漏对象的原因。例如,我通过&#34; Leaks&#34;它指导我这个例程:
这并不是很有启发性。很高兴知道泄露了什么,但我宁愿找出泄漏物体泄漏的原因,而不仅仅是泄漏物体的最初分配位置。
但是当我运行应用程序时(不是通过Instruments,而只是在调试器中运行它)并点击了&#34;调试内存图&#34;按钮,,然后我可以点击应该在左侧面板中释放的对象,现在我可以看到哪个对象保持强引用。在这种情况下,我可以看到我偶然建立的强大的参考周期:
有了这些信息,我可以追踪这些强大的参考资料的确定位置,并弄清楚它们为何仍然存在。或者,在这个例子中,我将追踪为什么我有一个强大的参考周期,并找出哪些参考需要weak
。