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で自分でラップできます(状態ごとに1つ)

于 2013-02-15T23:58:16.473 に答える
1

autoreleasefor ループで多くのを使用しない方が良いです。これを確認できますObjective-Cの自動解放メモリ管理について

于 2013-02-16T00:05:51.320 に答える