0

コードに何度も実行されるメソッドがあります。コードを何時間も実行できるようにする必要があるため、このメソッドは何百回も実行されます。

このメソッドは、大きくない一時変数で構成されています。ARC でのメモリ管理とパフォーマンスに関して、次の 4 つの方法のうちどれが最適なのだろうかと思います。

1) すべての一時オブジェクトを割り当て初期化します。
2) 代わりに「便利な」初期化子を使用します (つまり、[NSDictionary dictionaryWithObjectsAndKeys:...])。
3) これらの一時オブジェクトを ivars/properties/global として宣言し、Class +init メソッドで一度初期化し、複数回実行されるこのメソッドで (初期化せずに) 設定するだけです。
4) @autorelease ブロックを使用してメソッド全体をスコープします。

ARCプロジェクトの下で、それぞれがパフォーマンスとメモリ管理にどのような影響を与えるかを説明してください.

どうもありがとうございました!

4

2 に答える 2

1

さまざまなアプローチの実行時間に関して、4 つの異なるメソッドの平均実行時間を測定するサンプル iOS プロジェクトを作成しました。

コードを github からダウンロードしてテストし、MethodsToTest.mクラスのコンテンツを置き換えることができます。

私が行ったテストから、便利なメソッドを使用すると、alloc-init の方法よりもわずかに優れたパフォーマンス (0.004 ミリ秒向上) が得られます。

于 2012-11-22T09:09:51.590 に答える
1

各ループの最後でオブジェクトを nil してから再初期化する場合、理論的には ARC はこの時点でオブジェクトを解放する必要があります。

iVar への再割り当ては、従来のセッター パターンを効果的に挿入する必要があります。

if (newVal != iVarVal) {
    [iVarVal release];
    iVarVal = [newVal retain];
} 

いずれにせよ、オブジェクトが必要以上に長くぶら下がってはいけません。これが ARC のポイントです。確認したい場合は、テスト プロジェクトを設定し、割り当てツールを使用して計測器でプロファイリングし、メモリ使用量が継続的に増加するか、横ばいになるか、どの時点で横ばいになるかを確認します。

コードを簡潔にするために、使用されるスコープ内 (つまり、ループ内) で変数を宣言するか、ループのすぐ外側で変数を宣言して値を再割り当てします。再割り当てする前に、変数を nil することをお勧めします。

編集

あなたのコメントに加えて、これは私がベストプラクティスであると考えるものです

- (void)exampleMethod {
    id variable = nil;
    for (int i = 0; i < LOOP_LIMIT; i++) {

        // init 
        variable = <alloc/init variable here>

        /* use variable somehow.... */

        // nil variable before reassigning 
        variable = nil;
    }
}
于 2012-11-21T10:13:32.447 に答える