ios - UICollectionView 迭代单元格 - 内存警告

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

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

可能是什么问题?

编辑

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

最佳答案

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

使用此代码删除所有 subview

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

关于ios - UICollectionView 迭代单元格 - 内存警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22191361/

相关文章:

iphone - iOS/iPhone CoreData 关系

ios - iPhone/iOS GPS 精度统计置信度

objective-c - 使用点语法或括号语法设置属性之间有区别吗?

ios - 我怎样才能正确识别用户修改了哪些单元格的 subview ?

iphone - 以编程方式隐藏 UIAlertView?

ios - 我的 XCode UI 测试如何检测到屏幕已更改?

ios - 如何使用 (IBAction)playsound :(id)sender 播放声音

ios - 根据已排序的另一个数组的顺序调整一个数组的顺序

ios - Core Spotlight,objective-c 中的 continueUserActivity?

ios - 如何在iOS 8扩展应用程序的状态栏中指示网络事件