将图像添加到阵列内存问题

时间:2010-03-27 21:25:01

标签: iphone memory arrays nsmutablearray

我目前面临以下问题:

我的应用动态创建图像(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]];

希望,这有帮助。再次感谢。

2 个答案:

答案 0 :(得分:1)

可能有几个原因导致内存未被释放。

一个是你在循环中添加所有图像,自动释放池不释放自动释放的对象,直到控制返回到运行循环。您可能希望每次循环创建并释放NSAutoreleasePool。

另一个是对象未正确释放。使用“构建和分析”查找任何明显的内存泄漏。

答案 1 :(得分:0)

好的,发现问题 - 问题解决了:)。

实际上我的getGL方法遗漏了一些东西:

free(pixels);

这不会导致任何内存泄漏,而是增加内存。现在一切都恢复正常了。