【问题标题】:Memory not released after removing UIImageView from superview从超级视图中删除 UIImageView 后内存未释放
【发布时间】:2013-09-24 11:10:28
【问题描述】:

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

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

【问题讨论】:

  • 为 imageview 设置 nil 并释放 Imageview。
  • 我试过了,但没有任何作用。
  • 通过 Profile 使用 Memory Leak Instrument 并查看内存高的位置。
  • 您是否检查过您的内存在此代码上的高内存?
  • 附注:打开分页的 UICollectionView 会让您的生活更轻松。

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


【解决方案1】:

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

如果您希望图像自动发布,请使用imageWithContentsOfFile:imageWithData:scale:。请注意,您可以使用 NSBundle 中的方法获取图像路径,尽管会稍微复杂一些。

你必须自己实现以下部分

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

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

【讨论】:

  • 如果操作系统需要更多内存,缓存的图像将自动释放。我认为 imageNamed 在这个应用程序中更好,因为用户可能会将照片滑回视图。
  • @AaronBrager 是的,但您无法控制何时释放图像内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多