5

ブロックと言うときは、次のことを意味します。

^(int a) {return a*a;};

また、ブロックはiOS4以上でのみサポートされています。

これら2つの違いは何ですか?

4

3 に答える 3

4

AnNSInvocationはオブジェクトへの (セレクターを使用した) メッセージであり、オプションのパラメーターがあり、後で (または今) 実行でき、現在のコンテキストの外部で実行できます (もちろん、コピーしたものと、移動した場合に保持または参照するものに注意してください)。NSInvocation必要なものを正確に選択してコピー/参照できるという利点があります。

ブロックは、現在のスレッドのコンテキストの一部または全体をキャプチャできる秘密のローカル関数定義です。NSInvocationまた、スレッド (またはスコープ) のローカル コンテキストを自動的にキャプチャ、コピー、および保持するため、 よりも構成が少し簡単です。ブロックは、関数と同様に、バイナリ サイズをわずかに増やすことができます。ローカル コンテキストから取り出された場合 (たとえば、ブロックをコピーする場合)、ブロックは と比較して、かなり多くの CPU 時間とメモリを必要とする可能性がありますNSInvocation

于 2012-02-27T10:15:59.417 に答える
3

NSInvocationメッセージ呼び出しをカプセル化するオブジェクトです: ターゲット オブジェクト、セレクター、引数、および戻り値。ブロックは、コードのセクションと、そのセクションに至るまでのプログラムの状態に関する情報をカプセル化するオブジェクトです。具体的には、ブロックの作成までの呼び出し履歴に変数を記録します。

どちらも明らかにコールバックとして使用できます。呼び出しを使用してオブジェクトにメッセージを送信したり、関数のようにブロックのコードを実行したりできます。それらの違いは、それぞれの場合に状態を転送する方法です。呼び出しでは、メッセージが表示されるコンテキストを表すターゲット オブジェクトまたはパラメーターの 1 つが必要です。ブロックを使用すると、このコンテキストはブロックが作成されたときの状態から自動的にキャプチャされます。

于 2012-02-27T10:16:19.787 に答える
0

簡単に言えば、NSInvocationブロックほど強力ではありません。単一のオブジェクトで単一のメソッド呼び出しをカプセル化するだけですが、ブロックは任意のコードの多くの行をラップできます。非常に単純な 2 乗ブロックでさえ、2 乗自体を行う既存のクラスからのサポートがなければ、呼び出しを使用して表すことは不可能です。

于 2012-02-27T10:13:08.133 に答える