2

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

    }
}

使用 Activity Monitor 分析应用程序显示,当我轻弹图像时,实际内存使用量不断增长,尽管子视图的数量保持不变。

请注意,应用程序在没有调用 didReceiveMemoryWarning 的情况下终止。

如何强制我的应用释放 UIImage(s) 和 UIImageView(s) 使用的内存?

如果你能帮助我,不胜感激。

4

1 回答 1

5

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

如果您希望图像自动释放,请使用imageWithContentsOfFile:或。imageWithData:scale:请注意,您可以使用 from 方法获取图像路径,NSBundle尽管它会有点复杂。

您必须自己实施以下部分

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

不确定在使用新的 iOS 7 图像存储时如何获取图像的路径。

于 2013-09-19T11:49:10.560 回答