从superview中删除UIImageView后未释放内存

时间:2013-09-19 11:32:06

标签: ios objective-c memory-leaks uiimageview uiimage

在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使用的内存?

如果你能帮助我,非常感谢。

1 个答案:

答案 0 :(得分:5)

UIImage加载的

imageNamed:不会自动释放(它们被缓存,具有相同名称的图像共享相同的数据)。

如果您想要自动释放图像,请使用imageWithContentsOfFile:imageWithData:scale:。请注意,您可以使用NSBundle中的方法获取图像路径,尽管它会更复杂一些。

您必须自己实施以下部分

  

如果屏幕的比例为2.0,则此方法首先搜索具有相同文件名且附加了@ 2x后缀的图像文件。例如,如果文件名是按钮,则首先搜索按钮@ 2x。如果找到2x,则加载该图像并将返回的UIImage对象的scale属性设置为2.0。否则,它会加载未修改的文件名并将scale属性设置为1.0。

使用新的iOS 7图像商店时,不确定如何获取图像的路径。