3

私は、ブロックは第一級関数に似ていて、ラムダ式の計算スタイルの構造を可能にするはずだという印象を受けていました。しかし、以前の質問から、それらは実際には単なるオブジェクトであると言われました。

それから私は本当に2つの質問があります:

  1. それらの定義スコープにアクセスできるという機能に加えて、C++ の「友情」に似た方法でそれらを使用できると思いますが、なぜオブジェクトではなくブロックを使用するのでしょうか? 彼らはより軽量ですか?そうでない場合は、ブロックの代わりにオブジェクトをパラメーターとして渡し続ける可能性があるためです。

  2. ブロックには内部状態を維持する方法がありますか? たとえば、呼び出し間で値を保持するブロック内で宣言された変数。

4

2 に答える 2

3

それらの定義スコープにアクセスできるという機能に加えて、C++ の「友情」に似た方法でそれらを使用できると思いますが、なぜオブジェクトではなくブロックを使用するのでしょうか?

柔軟性。実装することが少なくなります。ブロックは、パラメーター リストまたは特定のオブジェクト タイプ以上のものを表すことができます。

彼らはより軽量ですか?

必ずしも。それらをツールボックスの別のツールと考えて、適切な (または必要な) 場所で使用してください。

ブロックには内部状態を維持する方法がありますか? たとえば、呼び出し間で値を保持するブロック内で宣言された変数。

はい、スタック オブジェクトのコピーだけでなく、参照カウントも実行できます。それは、必要なパラメータを表すオブジェクトよりも軽量であるとは限りません。

関連している

NSInvocation とブロックの違いは何ですか?

于 2012-04-23T01:42:32.940 に答える
2

ブロックはファーストクラスの関数に似ているはずでした [...] 実際には単なるオブジェクトです。

これらは、実際には第一級の関数であり、ObjC の目的でオブジェクトとして実装されています。それらも利用可能なプレーンCでは、密接に関連しているがオブジェクトベースではない実装があります。現時点で最も便利な方法でそれらについて考えることができます。

では、なぜオブジェクトではなくブロックを使用するのでしょうか?

ブロックは、それを囲むスコープから変数を自動的にキャプチャするコードの実行可能なチャンクです。カスタム オブジェクトの状態とアクションは、より明示的に処理する必要があり、一般的ではありません。古いオブジェクトを完了引数として使用することはできませんが、実行可能オブジェクトはその法案に完全に適合します。

ブロックには内部状態を維持する方法がありますか? たとえば、呼び出し間で値を保持するブロック内で宣言された変数。

もちろん、static関数やメソッドと同じように変数を宣言できます。

void (^albatross)(void);
albatross = ^{
            static int notoriety;
            NSLog(@"%d", notoriety++);
        };

albatross();
albatross();
albatross();
albatross();
于 2012-04-23T01:52:40.380 に答える