【问题标题】:iOS slow to release images while scrolling (no tableview)iOS 在滚动时释放图像很慢(没有表格视图)
【发布时间】:2013-04-24 00:32:12
【问题描述】:

问题来了: 我正在编写一个显示一些图片的应用程序,带有树形图布局(例如,请参阅https://raw.github.com/beckchr/ithaka-treemap/master/Core-API.png) 此布局显示在 UIScrollView 中。由于可以将许多图片添加到该滚动视图中,因此我想释放当前不在屏幕上的图片。我没有使用 ARC。

就我而言,我知道我应该发布哪些图片,以及如何在滚动时发布(调用一些“卸载”方法)。该方法没有无用的调用。问题是,当图片被释放时,滚动会停止一小会儿(几毫秒,但这已经够难看了,让滚动有点“跳跃”,而且很慢,一点也不流畅)。

我尝试过的(放在我的“卸载”方法的主体中):

imageview.image = nil
performSelectorInBackground:@selector(effectiveUnload) withObject:nil
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0,^(void){
dispatch_sync(dispatch_get_main_queue(), ^(void){
imageview.image=nil}
}

我认为这个问题很奇怪,因为内存分配绝对没有减慢效果,而只是内存释放。

感谢您的帮助,请随时询问更多信息。

【问题讨论】:

  • 你有什么理由不使用 UITableView 吗?
  • 主要原因是树状图显示。我的图片有一些坐标,可以更改(它不会显示具有稳定布局的列表)

标签: ios objective-c performance ipad memory-management


【解决方案1】:

您是否尝试过removeFromSuperview 从滚动视图中删除图像视图

【讨论】:

  • 不,我没有。我想让 UIImageView 就位,以便在需要时快速重新加载 UIImage。如果需要,我将尝试删除 UIImageView 并再次添加它。感谢这个想法。
  • 嗯,完全一样的问题。当我removeFromSuperview(和self.imageView = nil,因为我确实将它保留为属性)时,滚动仍然停止了一点。
【解决方案2】:

不要添加越来越多的 UIImageViews - 回收它们! 为了尽可能多地节省内存,您应该遵循 UITableView 回收视图的方式: 1.一旦视图离开可见区域,将其添加到“视图池”(并将其从其父视图中删除。这不是扩展操作!) 2. 当一个新视图变得可见时,首先检查池中是否有视图。如果没有,则创建一个新视图。

我知道我的回答不能直接回答您的问题,但这是正确的方法。否则你最终会耗尽内存。

【讨论】:

  • 我认为这是个好主意,即使它没有回答问题。 UIImageViews 的数量可以很高,但不是无限的。只要我未显示的图像视图为空,我认为我不会耗尽内存。问题是它可能会对我的代码产生一些深远的影响,所以如果我没有任何其他选择,我会这样做。另外,还会有图片发布,这是问题的问题。
  • 是的,如果我注释imageview.image = nil,绝对没有问题,滚动是完美的,即使我重新加载已经加载的图像。问题真的来自发布。
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多