分配有objectAtIndex的UIView分配了太多内存

时间:2012-08-07 10:13:39

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

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

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

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

现在对于一些代码: 这是分配如此多内存的方法,恰好是它的第一行(预ARC,它更长,但我减少它以获得创建分配的东西)。当我删除它时,无限分配停止。再说一遍:这个方法每秒被调用很多次,并且在与主队列不同的队列中。

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

这就是它在Allocations中的表现: 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;
}

1 个答案:

答案 0 :(得分:0)

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

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

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

有关本地自动释放池的一些文档以及您希望使用的文档,请参阅here