我知道块调制器在调用时会在堆栈上传递给块函数。我的代码中是否有可用于引用此变量的变量名称(如self
或_cmd
方法)
(^{
// how can I access the block descriptor here?
})();
修改
我实际上想要块对象,而不是块描述符......
答案 0 :(得分:6)
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值。
答案 1 :(得分:2)
创建一个为您初始化每个块的方法可能会有所帮助。这是一个快速测试,演示每个块都有自己的变量:
-(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