我对块有点新,需要一些帮助。我想在NSDictionary
中存储一个块,并在根据key
访问该块时执行该块。这是我迄今为止的一个例子。
NSDictionary *blocks = [NSDictionary dictionaryWithObjectsAndKeys:
^{NSLog(@"Log Block 1");}, @"Block1",
^{NSLog(@"Log Block 2");}, @"Block2",
nil];
然后我使用keyEnumerator
枚举字典。我知道正确存储了块,因为我在枚举期间调用NSLog(@"%@", [blocks objectForKey:key]);
并获取<__NSGlobalBlock__: 0x100003750>
。所以我知道我可以访问它但是如何在此时执行它?
答案 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)();