Objective-C中BFS的内存考虑因素

时间:2013-02-15 23:39:28

标签: objective-c cocoa memory-management nsautoreleasepool

我在Objective-C中编写过一个拼图求解器。它使用广度优先搜索来探索从初始拼图状态可到达的状态。当遇到第一个获胜状态时终止搜索。唯一的优化是查找表,有助于防止从已经看到的状态重新探索。

该算法似乎正常工作。然而,分析显示它使用了大量内存,我想了解原因。我认为我的理解差距与Objective-C运行循环和自动释放池有关。

以下(简化)代码是否允许运行循环完成迭代并耗尽自动释放池?

- (void) search {
    while (![myQueue empty]) {
        State *state = [myQueue pop];
        for (State *s in [state allReachableStates]) {
            [myQueue push:s];
        }
    }
}

分析显示用于NSArrays的大量内存。这是有道理的,因为allReachableStates确实创建了相当数量的数组。由于它们都是自动释放的,因此上述代码似乎可能会阻止自动释放池耗尽。

注意所有代码都在主线程上运行,我没有使用ARC。

修改:因此修复程序将for循环包裹在@autoreleasepool中。

2 个答案:

答案 0 :(得分:3)

你是对的,与此转弯的runloop相关联的自动释放池不会在此方法中耗尽。在此方法返回后的一段时间内不会耗尽。

您可以自己将while块包装在@autoreleasepool中(每个状态一个)

答案 1 :(得分:1)

最好不要在for循环中使用大量autorelease。您可以查看此Understanding Objective-C autorelease memory management