我的应用有三个UIImageViews
的视图。大约有150张图片作为资源文件,每张图片大约为24k。该应用程序将显示所有图像,但一次只显示三个。
但是每次我点击按钮将另外三个图像加载到UIImageViews
时,乐器中的“总字节数”列增加了大约700K,直到我最终得到一个低内存警告然后应用程序崩溃。不知何故,我用于每个三个图像的内存都没有被释放。
我用Google搜索并尝试了我所知道的所有方法,但没有成功,我需要帮助。
我试过这个:(此代码是加载另外三张图片的操作的一部分。三个ImageView是imgShownLeft
,imgShownMiddle
和imgShownRight
。这些是实例变量我首先必须将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
答案 0 :(得分:-1)
我认为你想要的是使用
img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]];
进行加载(因为UIImage imageNamed:
据说会做一些你不想要的缓存),然后添加
[img release];
每次setImage
调用后,因为子视图应为retain
- 图像,因此您泄漏了引用计数。
我原以为autorelease
的第二个版本可以正常工作,但老实说,即使我很清楚我知道自己在做什么,Cocoa内存管理规则仍会让我感到困惑。