9

我对块有点陌生,需要一些帮助。我想在一个块中存储一个块,NSDictionary并在基于它的key. 这是我到目前为止的一个例子。

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

然后我通过使用枚举字典keyEnumerator。我知道该块已正确存储,因为我NSLog(@"%@", [blocks objectForKey:key]);在枚举期间调用并 get <__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 回答