UICollectionView迭代单元格 - 内存警告

时间:2014-03-05 07:31:40

标签: ios iphone objective-c memory

在做了一些调试后,我发现以下代码使我的应用程序的内存使用量不断增长,直到应用程序崩溃。当我启动应用程序时,内存使用量约为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编程很新)
  6. 现在我没有发布代码的重新生成,因为正如我所说,当我注释掉内部块时,应用程序正常运行 - 也就是说,它创建了我的单元格,当我滚动时没有问题(内存仍然是2.1MB) )。

    可能是什么问题?

    修改

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

1 个答案:

答案 0 :(得分:5)

因为无论何时滚动集合视图,您都会一次又一次地向该视图添加UILable。这会增加记忆力。您可以在添加新视图之前从该单元格中删除所有现有视图。

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

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