2012-02-27 4 views

答えて

0

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

3

NSInvocationは、後で(または現時点で)実行することができ、現在のコンテキストの外で(選択したパラメータを使用して、セレクタを使用して)それを移動)。 NSInvocationには、必要なものだけを選択的にコピー/参照できるという利点があります。

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

3

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

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

+0

ブロックは機能ですか?またはオブジェクトですか? As @Justin says:ブロックは秘密のローカル関数定義 – holsety

+0

です。それは両方です:)。ブロックは無名関数で、ブロックを作成した時点のスタックのコピー(多かれ少なかれ)と一緒になります。これはObjective-Cオブジェクトでもあり、ブロックのコピーを作成してその後でそれらのコピーをリリースすることができます。ブロックを実行すると、実際にその関数を呼び出すだけです。ランタイムは関数を入力する前にブロックのスタックを設定します。 –

関連する問題