我知道块描述符在调用时会在堆栈上传递给块函数。是否有一个变量名可以用来在我的代码中引用它(例如方法self
或_cmd
方法)
(^{
// how can I access the block descriptor here?
})();
编辑
我实际上想要块对象,而不是块描述符......
我知道块描述符在调用时会在堆栈上传递给块函数。是否有一个变量名可以用来在我的代码中引用它(例如方法self
或_cmd
方法)
(^{
// how can I access the block descriptor here?
})();
编辑
我实际上想要块对象,而不是块描述符......
简而言之,你不能。至少不是直接的(没有类似于self
在块内的东西——我们对此进行了长时间的思考,但是根据以下模式无法提出既优雅又足够需要它的东西来证明添加这样的语法是合理的) .
如果要引用该块,则需要执行以下操作:
__block void(^strawberryFields)();
strawberryFields = ^{ strawberryFields(); };
strawberryFields();
请注意,以上将永远运行。另请注意,如果您计划稍后使用该块,您可能希望在分配时复制该块。
考虑:
NSMutableArray *array = [NSMutableArray array];
int i;
for(i = 0; i<5; i++) {
[array addObject:[^{ return i*i; } copy]];
}
你最终会得到一个包含 5 个块的数组,每个块捕获不同的 i 值。
创建一个方法来为您初始化每个块可能会有所帮助。这是一个快速测试,演示每个块都有自己的变量:
-(void (^)(void))intAddingBlock:(NSString *)name {
__block int intForThisBlock = 0;
return ^{
NSLog(@"%@ before: %d", name, intForThisBlock);
intForThisBlock += 5;
NSLog(@"%@ after: %d", name, intForThisBlock);
};
}
-(void)testTheBlock {
void(^block1)(void) = [self intAddingBlock:@"block 1"];
void(^block2)(void) = [self intAddingBlock:@"block 2"];
block1();
block1();
block2();
block1();
block2();
}
输出:
block 1 before: 0
block 1 after: 5
block 1 before: 5
block 1 after: 10
block 2 before: 0
block 2 after: 5
block 1 before: 10
block 1 after: 15
block 2 before: 5
block 2 after: 10