4

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

但是每次我单击按钮将三个图像加载到 中UIImageViews时,Instruments 中的“Overall Bytes”列会增加大约 700K,直到我最终收到内存不足警告,然后应用程序崩溃。不知何故,我每次加载三张图像所使用的内存都没有被释放。

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

我试过这个:(这段代码是加载另外三个图像的动作的一部分。三个 ImageView 是imgShownLeftimgShownMiddleimgShownRight。这些是实例变量。我首先必须放入currentImage所有三个UIImageViews,然后放入previousImage左边的一个和nextImage在右边:

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];

imgUIImageViews相同的方式分配,然后 [img release];

然后我尝试了:

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

然后我尝试了:

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

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

我知道可以一次加载三个图像,而无需在内存中保存 150 个图像!我究竟做错了什么?

感谢您的任何见解。/SD

4

1 回答 1

-1

我想你想要的是使用

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

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

[img release];

每次setImage调用后,因为子视图应该是retain图像,所以你泄漏了引用计数。

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

于 2009-07-11T12:43:17.807 回答