在iOS 6.1上,我有一个带有scrollView的视图控制器,当用户在页面中轻弹时,我需要显示一些图像。 scrollView有3个子视图,分别显示当前图像,上一图像和下一图像。在滚动期间替换图像。 该机制工作正常,但资源未按预期释放,并且在滚动大约15张图像后终止应用程序。
起初我尝试解决问题只是将新图像分配给UIImageView,但它不起作用(我读过图像被缓存),所以我尝试了另一种方法:
// access the UIImageView of the currentView
for (UIView *subviewOfCurrentView in [currentView subviews]) {
if ([subviewOfCurrentView isKindOfClass:[UIImageView class]]) {
UIImageView *cv = (UIImageView *)subviewOfCurrentView;
//cv.image = nil;
[cv removeFromSuperview];
UIImageView *new_cv = [[UIImageView alloc] initWithFrame:photoRect];
new_cv.image = [UIImage imageNamed:[myObject getFileName];
[currentView addSubview:new_cv];
}
}
使用活动监视器对应用程序进行概要分析表明,当我轻弹图像时,实际内存使用量会持续增长,尽管子视图的数量保持不变。
请注意,应用程序终止时不会调用didReceiveMemoryWarning。
如何强制我的应用释放UIImage(s)和UIImageView使用的内存?
如果你能帮助我,非常感谢。
答案 0 :(得分:5)
UIImage
加载的 imageNamed:
不会自动释放(它们被缓存,具有相同名称的图像共享相同的数据)。
如果您想要自动释放图像,请使用imageWithContentsOfFile:
或imageWithData:scale:
。请注意,您可以使用NSBundle
中的方法获取图像路径,尽管它会更复杂一些。
您必须自己实施以下部分
如果屏幕的比例为2.0,则此方法首先搜索具有相同文件名且附加了@ 2x后缀的图像文件。例如,如果文件名是按钮,则首先搜索按钮@ 2x。如果找到2x,则加载该图像并将返回的UIImage对象的scale属性设置为2.0。否则,它会加载未修改的文件名并将scale属性设置为1.0。
使用新的iOS 7图像商店时,不确定如何获取图像的路径。