我目前面临以下问题:
我的应用动态创建图像(320 x 480像素)并将它们添加到NSMutableArray。我需要在该数组中的那些图像,以允许用户来回浏览它们。我只需要保留最新的5张图片。所以我写了一个如下方法:
- (void)addImageToArray:(UIImage*)theImage {
if ([myMutableArray count] < 5) {
[myMutableArray addObject:theImage];
}
else {
[myMutableArray removeObjectAtIndex:0];
[myMutableArray addObject:theImage];
}
}
这种方法基本上可以做到它应该做的事情。但是,在我可以看到的工具中,内存使用量是永久递增的。在某些时候,即使我没有任何内存泄漏,应用程序最终崩溃。 我看到它的方式,XCode确实从我的数组中删除图像,但不释放它。有没有办法可以确保我想要从我的数组中删除的对象也会被释放?也许我的方法是完全错误的,我需要找到一种不同的方式。
任何帮助表示赞赏。提前致谢
[编辑:
根据要求,我正在添加部分代码,用于创建图像:
-(UIImage*)getGL {
unsigned char buffer[320*480*4];
glReadPixels(0,0,320,480,GL_RGBA,GL_UNSIGNED_BYTE,&buffer);
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320*480*4, NULL);
CGImageRef iref = CGImageCreate(320,480,8,32,320*4,CGColorSpaceCreateDeviceRGB(),kCGBitmapByteOrderDefault,ref,NULL,true,kCGRenderingIntentDefault);
size_t width = CGImageGetWidth(iref);
size_t height = CGImageGetHeight(iref);
size_t length = width*height*4;
uint32_t *pixels = (uint32_t *)malloc(length);
CGContextRef _context = CGBitmapContextCreate(pixels, width, height, 8, width*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextTranslateCTM(_context, 0.0, height);
CGContextScaleCTM(_context, 1.0, -1.0);
CGContextDrawImage(_context, CGRectMake(0.0, 0.0, width, height), iref);
CGImageRef outputRef = CGBitmapContextCreateImage(_context);
UIImage *outputImage = [UIImage imageWithCGImage:outputRef];
CGDataProviderRelease(ref);
CGImageRelease(iref);
CGImageRelease(outputRef);
CGContextRelease(_context);
return outputImage;
}
所以,现在我可以这样做:
[self addImageToArray:[self getGL]];
希望,这有帮助。再次感谢。
答案 0 :(得分:1)
可能有几个原因导致内存未被释放。
一个是你在循环中添加所有图像,自动释放池不释放自动释放的对象,直到控制返回到运行循环。您可能希望每次循环创建并释放NSAutoreleasePool。
另一个是对象未正确释放。使用“构建和分析”查找任何明显的内存泄漏。
答案 1 :(得分:0)
好的,发现问题 - 问题解决了:)。
实际上我的getGL方法遗漏了一些东西:
free(pixels);
这不会导致任何内存泄漏,而是增加内存。现在一切都恢复正常了。