【问题标题】:UICollectionView Iteration over cells - memory warningUICollectionView 迭代单元格 - 内存警告
【发布时间】:2014-04-07 03:12:29
【问题描述】:

在做了一些调试后,我发现以下代码使我的应用程序的内存使用量不断增长,直到应用程序崩溃。当我启动应用程序时,内存使用量约为 2MB,然后当我不断来回滚动时,它会继续增长。当我停止滚动一秒钟时,内存使用量会减少(虽然不是很严重,例如从 50M 到 35M)。请看看为什么我有:

这发生在我的自定义 UICollectionViewController 子类中:

for (myAppCell *cell in [self.collectionView visibleCells])
{
    UILabel *label [[UILabel alloc] initWithFrame:CGRectMake(10, 10, cell.frame.size.width, cell.frame.size.height)];
    label.text = @"Hello World!";

    [cell.contentView addSubview:label];
}

下面是我在调试时的观察结果:

  1. 如果我注释了 for 块内的所有代码,并在无限时间内来回滚动,应用程序内存稳定在 2.1MB(在这种情况下,它继续循环但实际上在内部什么都不做 - 因此问题必须与 UILabel 的分配)。
  2. 我尝试检查集合视图和单元格的子视图计数,它们分别为 14 和 1(应该是 - 所以我认为问题不在于子视图的累积)。
  3. ARC 已开启。
  4. 编辑实际上,只有在将 UILabel 添加到单元格时才会出现问题。当我评论最后一行 ([cell.contentView addSubview:label) 时,应用程序也正常运行。所以一定是这条线。
  5. 编辑:顺便说一下,一旦单元格不可见,我就不会删除它们(我不知道该怎么做,如果我真的需要这样做,我对 iOs 编程还是很陌生)。李>

现在我没有发布代码的剩余部分,因为正如我所说,当我注释掉内部块时,应用程序运行正常 - 也就是说,它创建了我的单元格,当我滚动时没有问题(内存保持在 2.1MB )。

可能是什么问题?

编辑

此代码位于我的CustomCollectionViewControllerreloadData 方法中。它是从scrollViewDidEndDecelerating 方法调用的。

【问题讨论】:

  • 您使用哪种方法遍历所有可见单元格并添加此标签?是什么触发了您的 for 循环?你说你在你的子类中这样做,但你没有说在哪里。
  • @Rob 我已经编辑了问题。
  • 您没有使用cellForItemAtIndexPath 向您的单元格添加子视图吗?
  • 你使用dequeueReusableCellWithReuseIdentifier吗?如果是这样,collection view 将重用该单元格,因此该单元格的标签会越来越多,从而导致内存警告
  • @Jung 是的,我确实使用它。我想一旦采用 CoolMonster 的解决方案,问题就解决了 :)

标签: ios iphone objective-c memory


【解决方案1】:

因为每当您滚动集合视图时,您都会一次又一次地将UILable 添加到该视图中。这将增加内存。在添加新视图之前,您可以简单地从该单元格中删除所有现有视图。

使用此代码删除所有子视图

 [[cell.contentView subviews]
     makeObjectsPerformSelector:@selector(removeFromSuperview)];

【讨论】:

  • 就是这样。谢谢!今天学到了一个新东西:)
  • 不应该是subviews(复数)吗?
  • @smileham 拼错了,现在更新
  • 谢谢!效果很好:)
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多