9

私はブロックに少し慣れていないので、助けが必要です。NSDictionaryブロックをに格納し、に基づいてアクセスされたときにそのブロックを実行したいと思いますkey。これが私がこれまでに例として持っているものです。

NSDictionary *blocks = [NSDictionary dictionaryWithObjectsAndKeys:
                              ^{NSLog(@"Log Block 1");}, @"Block1",
                              ^{NSLog(@"Log Block 2");}, @"Block2",
                              nil];

次に、を使用して辞書を列挙しkeyEnumeratorます。NSLog(@"%@", [blocks objectForKey:key]);列挙中に呼び出して取得するので、ブロックが適切に格納されていることがわかります<__NSGlobalBlock__: 0x100003750>。だから私はそれにアクセスできることを知っていますが、この時点でどのように実行できますか?

4

3 に答える 3

15

これを試して:

void(^myAwesomeBlock)() = [blocks objectForKey:key];
myAwesomeBlock();
于 2012-04-05T22:16:05.177 に答える
4

ただし、各ブロックに対して後続の呼び出しが行われると、それ以降に変更された可能性のある情報が含まれるのではなく、最初に実行されたときと同じ情報が返されることに気付きました。元の情報を返すのではなく、呼び出されるたびに実行する方法はありますか?

ブロックに関するドキュメント、特に「変数のタイプ」というタイトルのセクションを参照してください。

次のルールは、ブロック内で使用される変数に適用されます。

  • 囲んでいる字句スコープにローカルなスタック(非静的)変数は、const変数としてキャプチャされます。

    それらの値は、プログラム内のブロック式のポイントで取得されます。ネストされたブロックでは、値は最も近い囲みスコープからキャプチャされます。

  • __blockストレージ修飾子で宣言された囲んでいる字句スコープにローカルな変数は参照によって提供されるため、変更可能です。

    変更は、同じ囲みの字句スコープ内で定義された他のブロックを含め、囲みの字句スコープに反映されます。これらについては、「__blockストレージタイプ」で詳しく説明しています。</p>

于 2013-08-20T04:35:08.650 に答える
1

キャストする必要があります:

id bar = [blocks objectForKey:@"Block1"];
((void(^)())bar)();
于 2012-04-05T22:17:34.303 に答える