私は、ブロックがObjective-Cで実行可能コードの再利用可能なチャンクであることを知っています。同じコードを関数に入れて、そのコードを実行する必要があるときに関数を呼び出すべきではない理由はありますか?Objective-Cでブロックを関数に使用する利点はありますか?
応答でブラッド・ラーソンのコメントとして答えて
これは達成しようとしていることによって異なります。ブロックに関する素晴らしい点の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から:彼らはあなたが で、呼び出しの時点でコードを書くことができ
:
ブロックは 2つの主な理由のための伝統的なコールバック関数への有用な代替あり後でメソッドの実装のコンテキストで実行されます。ブロックは であり、しばしばフレームワークメソッドのパラメータです。
ローカル変数にアクセスできます。コールバック を使用するのではなく、操作を実行するために必要なすべてのコンテキストの 情報を具現化するデータ構造が必要です。ローカルの 変数に直接アクセスするだけです。
ブロックあなたは、彼らができるように、 を イベントに応答して行われていますが、別のメソッドまたは関数を記述しているのではなくアクションを定義できますそのイベントのリスナーを に設定したところで、処理コードを記述してください。これにより、コードの混乱を防ぎ、 アプリケーションをもっと組織化することができます。
私があなたに与えることができる良い例は、警告表示の作成時に決定した場合に良いでしょう。代わりに、私は委任方法を書いて待ちますそれを呼び出すこと。したがって、理解して実装するのがずっと簡単になり、処理も高速になります。
他の人が適切な引用せずに別の場所に書かれている事を盗用しないでください。これにより、あなたはこのサイトから非常に迅速に停止されます。 –
ええと...私は将来それをするつもりです...最近の最後の時間に逃したかもしれないかもしれません.. – rishi
- 1. ObjectiveCブロックを関数ポインタにラップする方法はありますか?
- 2. ニューラルネットワークにテンソルフローを使用する利点はありますか?
- 3. 関数内で関数を呼び出す利点はありますか?
- 4. Mantra.jsアーキテクチャフレームワークを使用する利点はありますか?
- 5. LF over CRLFを使用する利点はありますか?
- 6. Androidサポートライブラリの使用に不利な点はありますか?
- 7. リンクの代わりにボタンを使用する利点はありますか?
- 8. userscriptでは、querySelector()とjQueryの$()を使用する利点はありますか?
- 9. Python 3を使用する利点/利点は何ですか?
- 10. アプリケーションデータベースを使用パターンで分けることに利点はありますか?
- 11. Cで関数プロトタイプを使用しないと何か利点はありますか?
- 12. PHPでオブジェクトを使用するとパフォーマンス上の利点はありますか?
- 13. NativeScriptでSwiftやJavaを使用する利点はありますか?
- 14. 休止状態でラクダコンポーネントを使用する利点はありますか?
- 15. オブジェクトを関数型プログラミング言語で使用する利点は何ですか?
- 16. PHPで匿名関数を使用する利点は何ですか?
- 17. C++で&(アドレス)演算子を使用する代わりに、std :: addressof()関数テンプレートを使用する利点はありますか?
- 18. ポインタの代わりにグローバル変数を使用する利点はありますか?
- 19. `unreachable!` vs `panic!`を使用するとパフォーマンス上の利点はありますか?
- 20. フォントフェイスを宣言するときに複数のフォントファイルタイプのソースを使用する利点はありますか?
- 21. Webデザイナー...水平メニュー用に複数の弾丸を使用する利点はありますか?
- 22. NSOperationクラスのコールバック関数を使用した完了ブロックの利点
- 23. JavaScriptで匿名関数を使用する際に欠点はありますか?例えば。メモリ使用?
- 24. 64ビットOSで開発する利点はありますか?
- 25. プロキシキャッチサーバーを使用する利点と欠点は何ですか?
- 26. 「通常の」モジュール関数呼び出しよりも「適用」を使用する利点は何ですか?
- 27. メモリ管理の目的で複数のヒープを使用する利点はありますか?
- 28. HTML5/CSS:セクションエレメント内に複数のwrapper-divを使用する利点はありますか?
- 29. JavaScriptで `return cb()`に不利な点はありますか?
- 30. Visual Studioで「マルチプロセッサコンパイル」に不利な点はありますか?
すばらしい説明。しかし、私は理由1の質問があります。たとえば、完了ハンドラブロックを取る。マルチスレッドが含まれない場合、すなわち、メソッドとそのブロックが両方ともメインキューで実行されているため、ブロック内とブロック外に完了コードを置くことに違いはありません。どちらの場合も、メソッドの終了後に完了コードが実行されるためです。それが正しいか? – Philip007
はい、そうですが、メソッドが非同期的に何かを行う時間が必要なケースが多く、メインスレッドをブロックすることなく(NSRunLoopを参照してください)マルチスレッドではありません。同じメソッドが時々同期的に実行され、返される前に完了ブロックを呼び出し、他の時間が非同期に実行されるアプリケーションがあります。別の(呼び出し)コードを記述することなく、両方の可能性を可能にすることは良いことです。もう1つのことは、コンプリートブロックには引数があることが多く、基本的にメソッドが複数の値を返すことができる点です。 –
WWDC 2011のセッション308(「Blocks and GCD in Practice」)では、ソートに関連する優れた例を使って、通常の機能(この回答に記載されている)を超えるブロックの利点を強調しています。 – Aky