1

ブロック記述子は、呼び出されたときにスタック上でブロック関数に渡されることを知っています。コードでこれを参照するために使用できる変数名はありますか (selfまたは_cmdメソッドのように)

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

編集

ブロック記述子ではなく、実際にはブロックオブジェクトが必要です...

4

2 に答える 2

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 をキャプチャします。

于 2013-03-21T18:42:06.733 に答える
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
于 2013-03-23T17:11:23.907 に答える