如何在块功能中引用当前块对象?

时间:2013-03-21 18:31:31

标签: objective-c objective-c-blocks

我知道块调制器在调用时会在堆栈上传递给块函数。我的代码中是否有可用于引用此变量的变量名称(如self_cmd方法)

(^{
    // how can I access the block descriptor here?
})();

修改

我实际上想要块对象,而不是块描述符......

2 个答案:

答案 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