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
.