1

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

问题是:我的计时器有一个异步队列(使用 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;
}

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

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

编辑:这就是代码在所有功能等方面的外观。我只用一行发布上面的代码的原因是因为现在我不在乎它是否像它应该的那样工作,我只想解决分配问题问题。抱歉误导。至于 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;
}
4

1 回答 1

0

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

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

尽管我坦率地承认这是一个猜测。

有关本地自动释放池的一些文档以及为什么要使用它,请参阅此处。

于 2012-08-07T11:27:08.927 回答