Objective-C中BFS的内存注意事项



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

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

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

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

评测显示用于NSArray的大量内存。这是有道理的,因为allReachableStates确实创建了相当数量的数组。由于它们都是自动释放的,所以上面的代码似乎阻止了自动释放池的耗尽。

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

编辑:所以修复程序是将for循环包装在@autoreleasepool中。

您说得对,与运行循环的这一回合相关的自动释放池不会在该方法中耗尽。直到该方法返回一段时间后,它才会被耗尽。

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

最好不要在for循环中使用大量autorelease。您可以查看此Understanding Objective-C自动释放内存管理

相关内容

  • 没有找到相关文章

最新更新