2

しますか?

私は通常これを選びます、

NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];
[self setMonths: monthsForChosenYear];

これ以上、

[self setMonths: [self monthsForYear:newChosenYear]];

一目でわかりやすいからです。2番目のアプローチでは、それほど多くはありません。

しかし、これの実際の意味は何ですか?monthsForChosenYearは単なるポインタですが、何らかの方法で保存する必要があります。

影響が小さすぎて心配する必要がないかどうかは尋ねていません。しかし、私はこれについて非常に興味があります。

より詳細に説明しているドキュメントへのリダイレクトでさえもいいでしょう。

前もって感謝します!

ヌーノ

4

3 に答える 3

5

うまくいけばあなたの好奇心を和らげるための長い答え、そして好奇心を持つことは良いことです!パフォーマンスとメモリへの影響はゼロまたはごくわずかです。ポインタがどのように格納されているのか疑問に思います。入力するとき:

NSArray * monthsForChosenYear;

monthsForChosenYearローカルストレージに割り当てられる、名前で参照されるボックス(変数)を要求しています。このボックスは、囲んでいるメソッドが終了すると自動的に再利用され、コンパイラーがそれが不要であると判断した場合は、それよりも早く再利用される可能性があります。このボックスは、タイプの値を保持できますNSArray *

入力するとき:

NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];

あなたは2つのことを求めています、それは単に次の略記です:

NSArray * monthsForChosenYear;
monthsForChosenYear = [self monthsForYear:newChosenYear];

2行目はメソッドを呼び出し、戻り値を。という名前のボックスに格納しますmonthsForChosenYear。最後に入力するとき:

[self setMonths: monthsForChosenYear];

ボックスに保存されている値monthsForChosenYearがメソッドに渡されます。ボックスを使用しなくなった場合monthsForChosenYear、コンパイラはボックスを再利用するか、囲んでいるメソッドの終了またはその他の適切なポイントまで待機する場合があります。

コンパイラはボックスの使用状況を分析して最適化しますが、ボックスが不要であると判断された場合でも、ボックスを割り当てない場合があります。ボックスを割り当てるコストはごくわずかです。

* [注:実際には通常、2種類のローカルボックスがあります。2つ目は、レジスタと呼ばれることが多く、割り当てコストは通常​​、微小よりもさらに小さくなります。どの種類のボックスを使用するかは、コンパイラによって決定されます。] *

入力するとき:

[self setMonths: [self monthsForYear:newChosenYear]];

1行で2つのメソッドを呼び出すように要求しており、内部呼び出し()から返された値を[self monthsForYear:newChosenYear]外部呼び出しに渡す必要があります。コンパイラはこの結果をどこに保存しますか?コンパイラは事実上、上記を次のように変換します。

NSArray *compilerTemporaryBox = [self monthsForYear:newChosenYear];
[self setMonths:compilerTemporaryBox];

上記からあなたはそれがどうなるかを知っています。コンパイラには、必要な時間を知っているという小さな利点があるcompilerTemporaryBoxため、それを理解する必要はありませんが、コンパイルされたコードには影響しません。

結局のところ、全体的な答えは、それをどのように書くかは問題ではないということです。

さらに、使用するメモリ管理のタイプ:MRC、ARC、またはGC。答えには影響しません-コンパイラは両方のバリアントを同じように扱うことになります。

だからあなたがあなたに最適だと思うスタイルを選びましょう。HTH。

于 2012-08-21T20:31:17.330 に答える
1

Clangはほぼ間違いなく、これら2つのコードを同じ結果のマシンコードにコンパイルするのに十分なほど賢いです。速度やメモリの問題に違いはありません。

于 2012-08-21T20:04:07.823 に答える
0

ARCを使用していますか?ARCがなければ、適切なオプティマイザを使用しても違いはありませんが、ARCを使用すると、追加の保持/解放を使用する場合があります。

于 2012-08-21T20:04:12.907 に答える