将新图像加载到UIImageView中,不会释放以前图像中的内存

时间:2009-07-11 04:17:17

标签: iphone uiimageview uiimage instruments

我的应用有三个UIImageViews的视图。大约有150张图片作为资源文件,每张图片大约为24k。该应用程序将显示所有图像,但一次只显示三个。

但是每次我点击按钮将另外三个图像加载到UIImageViews时,乐器中的“总字节数”列增加了大约700K,直到我最终得到一个低内存警告然后应用程序崩溃。不知何故,我用于每个三个图像的内存都没有被释放。

我用Google搜索并尝试了我所知道的所有方法,但没有成功,我需要帮助。

我试过这个:(此代码是加载另外三张图片的操作的一部分。三个ImageView是imgShownLeftimgShownMiddleimgShownRight。这些是实例变量我首先必须将currentImage放在所有三个UIImageViews中,然后将previousImage放在左侧,nextImage放在右侧:{/ p>

NSString *strImageToSet = [[imgNamesArray objectAtIndex:currentImage] stringByAppendingFormat:@".jpg"];
UIImage *img = [UIImage imageNamed:strImageToSet];
[imgShownMiddle setImage:img];
[imgShownLeft setImage:img];
[imgShownRight setImage:img];

NSString *strPreviousImage = [[imgNamesArray objectAtIndex:previousImage] stringByAppendingFormat:@".jpg"];
img = [UIImage imageNamed:strPreviousImage];
[imgShownLeft setImage:img];

NSString *strNextImage = [[imgNamesArray objectAtIndex:nextImage] stringByAppendingFormat:@".jpg"];
img = [UIImage imageNamed:strNextImage];
[imgShownRight setImage:img];

然后我尝试了这个:     而不是:

    UIImage *img = [UIImage imageNamed:strImageToSet];

我用过:

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:strImageToSet];

并以同样的方式将img分配给UIImageViews,然后是         [img release];

然后我尝试了:

    UIImage *img = [[[UIImage alloc] initWithContentsOfFile:strImageToSet] autorelease];

然后我尝试了:

    img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]];

但是在每种情况下,每次运行此操作都会增加内存需求。

我知道可以一次装入三张图像而无需在内存中保存150张图像!我做错了什么?

感谢您的任何见解。 / SD

1 个答案:

答案 0 :(得分:-1)

我认为你想要的是使用

img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]];

进行加载(因为UIImage imageNamed:据说会做一些你不想要的缓存),然后添加

[img release];
每次setImage调用后

,因为子视图应为retain - 图像,因此您泄漏了引用计数。

我原以为autorelease的第二个版本可以正常工作,但老实说,即使我很清楚我知道自己在做什么,Cocoa内存管理规则仍会让我感到困惑。