如何执行存储在NSDictionary中的块?

时间:2012-04-05 22:03:39

标签: cocoa nsdictionary block

我对块有点新,需要一些帮助。我想在NSDictionary中存储一个块,并在根据key访问该块时执行该块。这是我迄今为止的一个例子。

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

然后我使用keyEnumerator枚举字典。我知道正确存储了块,因为我在枚举期间调用NSLog(@"%@", [blocks objectForKey:key]);并获取<__NSGlobalBlock__: 0x100003750>。所以我知道我可以访问它但是如何在此时执行它?

3 个答案:

答案 0 :(得分:15)

试试这个:

void(^myAwesomeBlock)() = [blocks objectForKey:key];
myAwesomeBlock();

答案 1 :(得分:4)

  

但是,我注意到,当对每个块进行后续调用时,它会返回与首次执行时相同的信息,而不是包含任何可能已更改的内容。有没有办法让它在每次调用时执行而不是返回原始信息?

请参阅块上的文档,特别是标题为Types of Variable的部分:

  

以下规则适用于块中使用的变量:

     
      
  • 封闭词法范围本地的堆栈(非静态)变量被捕获为const个变量。

         

    它们的值是在程序中的块表达式处获取的。在嵌套块中,从最近的封闭范围捕获值。

  •   
  • 使用__block存储修饰符声明的封闭词法范围的局部变量由引用提供,因此是可变的。

         

    任何更改都会反映在封闭的词法范围中,包括在相同的词法范围内定义的任何其他块。这些将在“The __block Storage Type”中详细讨论。

  •   

答案 2 :(得分:0)

你需要施放:

id bar = [blocks objectForKey:@"Block1"];
((void(^)())bar)();