0

我在 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.

4

2 回答 2

3

您是对的,与此轮运行循环关联的自动释放池不会在此方法中耗尽。在此方法返回后的一段时间内,它不会被耗尽。

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

于 2013-02-15T23:58:16.473 回答
1

最好不要autorelease在 for 循环中使用很多。你可以检查这个Understanding Objective-C autorelease memory management

于 2013-02-16T00:05:51.320 回答