【问题标题】:UIView assigned with objectAtIndex allocates too much memory用 objectAtIndex 分配的 UIView 分配了太多内存
【发布时间】:2012-08-07 10:13:38
【问题描述】:

在这个问题上坐了几个小时后(我真的感觉像龙蛋上的鸡)我来这里问。

问题是:我的计时器有一个异步队列(使用 mach_absolute_time() 创建),在一段时间间隔后将 NSNotification 提供给 defaultCenter,然后运行我的方法。在 run 方法中,有一个用于查找视图交集的方法调用。我最近切换到 ARC,因为这似乎是一个非常好的主意。现在我有点后悔了,因为在 ARC 之前,这段代码确实正确地分配和解除分配,但现在它只分配自己。也许我错过了一些手动解除分配的代码,但是,当我尝试将视图设置为 nil 时,它根本没有帮助。此外,在 Allocations 中,由于 intersect 方法,malloc 4.00 KB 不断增加,这就是我问的真正原因,因为一段时间后,它达到了限制,我收到内存警告并且我的应用程序崩溃。

我需要这种方法的原因是我遍历了带有障碍物的视图子视图。当另一个视图与某些子视图的距离达到限制时,我会运行一些代码。

所以现在有一些代码: 这是分配这么多内存的方法,正是它的第一行(在 ARC 之前,它更长,但我减少了它以获得创建分配的东西)。当我删除它时,无限分配停止。再次提醒一下:这个方法每秒被调用很多次,并且在与主队列不同的队列中。

- (BOOL)obstacleIntersect {
    UIView *view = [[self subviews] objectAtIndex:0];
    return NO;
}

这就是它在分配中的样子: Mallocations

感谢您的帮助和阅读,因为您刚刚回答了这个冗长的问题。

编辑: 这就是代码在所有功能等方面的外观。我只用一行发布上面的代码的原因是因为现在我不在乎它是否像它应该的那样工作,我只想解决分配问题。抱歉误导。至于 uiview 粒子,它是与已经提到的子视图相交的视图。此代码也产生相同的无限分配。

- (BOOL)obstacleIntersect {
    for(UIView *view in [[[self subviews] objectAtIndex:0] subviews])
    {
        if (sqrt(pow(abs(particle.center.x - view.center.x), 2) + pow(abs(particle.center.y    - view.center.y), 2)) < particle.frame.size.width / 2 - 1) 
        {            
            return YES;   
        }
    }
    return NO;
}

【问题讨论】:

  • 感谢您尝试使其更简单!所以你仍然遇到单一分配(view =)以及快速枚举(for view in...)的问题?
  • 是的!没错,新malloc 4.00 KB的频率也差不多。

标签: objective-c ios5 memory-management uiview automatic-ref-counting


【解决方案1】:

如果此代码在运行循环的一次迭代中被多次调用,并且subviews 中有很多项目,则您可能遇到了自动释放池的问题 - 子视图数组是自动释放的,因为例如,虽然我不明白为什么 ARC 不立即将其删除。您可以尝试将对该方法的调用包装在它自己的自动释放块中:

BOOL intersects;
@autoreleasepool { intersects = [self obstacleIntersect];}
// do something with intersects...

虽然我承认这是一个猜测。

请参阅here,了解有关本地自动释放池的一些文档以及您为什么要使用一个。

【讨论】:

  • 好吧!猜测一下,这是一个非常惊人的猜测,它完全解决了问题!我非常感谢您花时间了解我的问题并找到合适且有效的解决方案!再次感谢您!
  • 乐于助人。欢迎使用 Stack Overflow!
猜你喜欢
  • 2012-06-20
  • 2015-12-04
  • 2011-08-04
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多