gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:31:45 24 4
gpt4 key购买 nike

我用 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 block 包装在 @autoreleasepool 中(每个状态一个)

关于objective-c - Objective-C 中 BFS 的内存注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com