2011-12-27 9 views
5

私は、ブロックがObjective-Cで実行可能コードの再利用可能なチャンクであることを知っています。同じコードを関数に入れて、そのコードを実行する必要があるときに関数を呼び出すべきではない理由はありますか?Objective-Cでブロックを関数に使用する利点はありますか?

応答でブラッド・ラーソンのコメントとして

答えて

14

これは達成しようとしていることによって異なります。ブロックに関する素晴らしい点の1つは、ローカルスコープを取得することです。関数でも同じ最終結果を得ることができますが、関連する値でいっぱいのコンテキストオブジェクトを回すようなことをする必要があります。ブロックでは、あなたがこれを行うことができます:単に変数NUM1を使用してそう

int num1 = 42; 
void (^myBlock)(void) = ^{ 
    NSLog(@"num1 is %d", num1); 
}; 

num1 = 0; // Changed after block is created 

// Sometime later, in a different scope 

myBlock();    // num1 is 42 

を、myBlockが定義された時点でその値がキャプチャされます。

Appleの documentationから

:彼らはあなたが で、呼び出しの時点でコードを書くことができ

  1. ブロックは 2つの主な理由のための伝統的なコールバック関数への有用な代替あり後でメソッドの実装のコンテキストで実行されます。ブロックは であり、しばしばフレームワークメソッドのパラメータです。

  2. ローカル変数にアクセスできます。コールバック を使用するのではなく、操作を実行するために必要なすべてのコンテキストの 情報を具現化するデータ構造が必要です。ローカルの 変数に直接アクセスするだけです。

+0

すばらしい説明。しかし、私は理由1の質問があります。たとえば、完了ハンドラブロックを取る。マルチスレッドが含まれない場合、すなわち、メソッドとそのブロックが両方ともメインキューで実行されているため、ブロック内とブロック外に完了コードを置くことに違いはありません。どちらの場合も、メソッドの終了後に完了コードが実行されるためです。それが正しいか? – Philip007

+0

はい、そうですが、メソッドが非同期的に何かを行う時間が必要なケースが多く、メインスレッドをブロックすることなく(NSRunLoopを参照してください)マルチスレッドではありません。同じメソッドが時々同期的に実行され、返される前に完了ブロックを呼び出し、他の時間が非同期に実行されるアプリケーションがあります。別の(呼び出し)コードを記述することなく、両方の可能性を可能にすることは良いことです。もう1つのことは、コンプリートブロックには引数があることが多く、基本的にメソッドが複数の値を返すことができる点です。 –

+0

WWDC 2011のセッション308(「Blocks and GCD in Practice」)では、ソートに関連する優れた例を使って、通常の機能(この回答に記載されている)を超えるブロックの利点を強調しています。 – Aky

4

this answerへ:

ブロックあなたは、彼らができるように、 を イベントに応答して行われていますが、別のメソッドまたは関数を記述しているのではなくアクションを定義できますそのイベントのリスナーを に設定したところで、処理コードを記述してください。これにより、コードの混乱を防ぎ、 アプリケーションをもっと組織化することができます。

私があなたに与えることができる良い例は、警告表示の作成時に決定した場合に良いでしょう。代わりに、私は委任方法を書いて待ちますそれを呼び出すこと。したがって、理解して実装するのがずっと簡単になり、処理も高速になります。

+4

他の人が適切な引用せずに別の場所に書かれている事を盗用しないでください。これにより、あなたはこのサイトから非常に迅速に停止されます。 –

+0

ええと...私は将来それをするつもりです...最近の最後の時間に逃したかもしれないかもしれません.. – rishi

関連する問題