我在iPhone应用程序中遇到图像有问题。我加载图像如下:如何以正确的方式加载和卸载图像
UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:@""]];
CGImageRef imageRef = image.CGImage;
NSInteger texWidth = CGImageGetWidth(*imageRef);
NSInteger texHeight = CGImageGetHeight(*imageRef);
GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4);
CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8,
texWidth * 4, CGImageGetColorSpace(*imageRef),
kCGImageAlphaPremultipliedLast);
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth,
(float)texHeight), *imageRef);
CGContextRelease(textureContext);
glBindTexture(GL_TEXTURE_2D, location);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, textureData);
free(textureData);
我想释放图像已使用的所有内存。我试图做到这一点,如下所示:
CGImageRelease(imageRef);
free(image);
但是,内存不会出现根据仪器被释放。我错过了什么吗?它被这些函数之一缓存了吗?此外,当我稍后重新载入图像时,它似乎会被加载两次,即alpha通道是第一次的两倍。再次,当我(试图)释放内存并重新加载第三次时,alpha通道是第一次的三倍。应该是几乎透明的部分变得越来越不透明。
透明度问题在iOS 3中没有被发现,只有iOS 4。但是内存未被释放的问题在两者中都被注意到了。
请有人可以帮助我吗?我花了很多时间搞乱图像!此外,我不认为我使用了一个愚蠢的图像:我正在制作一个使用大约40张图像的游戏,其中大部分是128x128 PNG。我如何快速用完内存?这种情况下的“常见”做法是什么?当我不需要图像时,我是否试图释放内存?
回覆将不胜感激!谢谢。
我用[image release]取代了免费版,但问题仍然存在。看起来和以前完全一样。有任何想法吗? – Sam
此外,当我释放图像时,仍然可以在屏幕上看到它(它是对象的纹理)。是否有任何openGL函数缓存图像?肯定有东西缓存了它,因为它仍然可见!非常感谢! – Sam
经过更多调查后,我发现512 * 512 PNG图像的磁盘上有大小为86 KB(在Finder中)。那么为什么它会在应用程序中占用超过3 MB的内存呢?我删除了调用加载该图像的函数(上面粘贴的所有东西)后,在它上面运行了Profiler/Instruments,并且它稳定在3.51 MB“Live Bytes”,但是如果函数被调用(它肯定只会调用一次, NSLogged它),那么“Live Bytes”稳定在6.80 MB。请帮忙!!为什么它会占用如此多的内存? – Sam