3

私はコードの「実行順序」の概念に取り組んでいますが、これまでのところ私の研究は不十分です。表現が間違っているかどうかはわかりませんが、この概念にはもっと適切な用語がある可能性があります。以下のさまざまなつまずきのブロックに誰かが光を当てることができれば幸いです。

メソッドを次々と呼び出すと、次のようになります。

[self generateGrid1];
[self generateGrid2];

両方のメソッドが実行されますが、generateGrid1 は必ずしも generateGrid2 を待機しません。しかし、それが必要な場合はどうすればよいですか? generateGrid1 がいくつかの複雑な計算 (未知の時間がかかる) を行い、generateGrid2 がその計算に使用する配列に値を入力するとしますか? これは、イベントが発生するたびに実行する必要があり、一度だけの初期化ではありません。

メソッドを順番に呼び出す方法が必要ですが、一部のメソッドが他のメソッドを待機するようにしています。私はコールバックを調べましたが、私が見たすべての例で、コンセプトは常にデリゲートと結びついています。

また、コード行が使用されるのに間に合うように解析されることを合理的に期待できないと判断する時期もわかりません。例えば:

int myVar = [self complexFloatCalculation];
if (myVar <= 10.0f) {} else {} 

「自分のことを始める前に、この他のことは完了していますか」のチェックを実装するのに十分な時間がかかるかどうかを判断するにはどうすればよいですか。試行錯誤だけ?

それとも、別のメソッドのパラメーターとしてメソッドを渡しているのでしょうか? メソッドを実行する前に、引数が評価されるのを待ちますか?

[self getNameForValue:[self getIntValue]];
4

2 に答える 2

6

次々とメソッドを呼び出すと、次のようになります。

[self generateGrid1];
[self generateGrid2];

両方のメソッドが実行されますが、generateGrid1は必ずしもgenerateGrid2を待機しません。しかし、必要な場合はどうなりますか?

誤り。generateGrid1実行され、次にgenerateGrid2実行されます。この順次実行は、手続き型言語のまさに基礎です。

技術的には、コンパイラはステートメントを再配置できますが、最終結果が元の結果と区別できないことが証明される場合に限ります。たとえば、次のコードを見てください。

int x = 3;
int y = 4;

x = x + 6;
y = y - 1;

int z = x + y;
printf("z is %d", z);

x+6またはy-1ラインが最初に発生するかどうかは実際には関係ありません。記述されたコードは、計算以外の中間値のいずれも使用しません。これzは、どちらの順序でも発生する可能性があります。したがって、コンパイラが何らかの理由でこれらの行を再配置することによってより効率的なコードを生成できる場合は、そうすることができます。

ただし、これらの中間値の1つを使用しようとすると(たとえば、ログに記録するために)、コンパイラはその値が使用されていることを認識し、次のようになるため、このような再配置の効果を確認することはできません。ロギングを壊す可能性のある最適化を取り除きます。

したがって、実際には、コンパイラーは、提供された順序でコードを実行する必要はありません。提供したコードと機能的に同一のコードを生成するだけで済みます。これは、最適化を行ってコンパイルされたプログラムにデバッガーを接続すると、これらの種類の最適化の効果を実際に確認できることを意味します。デバッガーが追跡しているソースコードは、コンパイラーが生成したコンパイル済みコードと行ごとに一致するとは限らないため、これはあらゆる種類の混乱を招きます。これが、プログラムのデバッグビルドの最適化がほとんど常にオフになっている理由です。

とにかく、要点は、コンパイラがこれらの種類のトリックを実行できるのは、効果がないことを証明できる場合のみであるということです。Objective-cのメソッド呼び出しは動的にバインドされます。つまり、コンパイラは、そのメソッドが呼び出されたときに実行時に実際に何が発生するかについて完全に保証されません。コンパイラーは何が起こるかについて保証できないため、コンパイラーはObjective-Cメソッド呼び出しを並べ替えることはありません。しかし、繰り返しになりますが、これは前に述べたのと同じ原則にフォールバックします。コンパイラは実行の順序を変更する可能性がありますが、それはユーザーが完全に認識できない場合に限られます。

言い換えれば、それについて心配する必要はありません。コードは常に上から下に実行され、各ステートメントは完了する前に1つのステートメントを待機します。

于 2012-04-10T20:30:00.243 に答える
5

一般に、説明したスタイルで表示されるほとんどのメソッド呼び出しは同期です。つまり、ステートメントがコーディングされた順序で実行され、2番目の呼び出しは最初の呼び出しが終了したにのみ実行され、戻り値。

また、メソッドがパラメーターを受け取る場合、メソッドが呼び出されるにそのパラメーターが評価されます。

于 2012-04-10T20:06:02.843 に答える