4

以下のコードを参照すると、ブロックが配列に配置されたら、そのブロック オブジェクトを取得して、ブロック内の実際のコードを実行するにはどうすればよいでしょうか。

別の質問: 以下のようなブロックでメソッドを呼び出す場合、そのブロックはそのメソッドのコードをカプセル化しますか、それともメソッドのシグネチャを取得してそのように呼び出しますか?

-(void)blockCalledMethod
{
    NSLog(@"Hello World");
}

-(void)programStart
{       

    NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [self blockCalledMethod];} copy] autorelease],nil];    

    id pointerToBlock = [array lastObject];
}
4

1 に答える 1

7

次のように呼び出します。

void (^pointerToBlock)(void) = [array lastObject];
pointerToBlock(); // because ^ {} is void(^)(void)

直接呼び出したい場合はpointerToBlock、 として宣言することはできません。これは、コンパイラがそれを単なるオブジェクトではなくブロック型として認識しなければならないためです。id

上記のようにブロック内のメソッドを呼び出す場合、そのブロックはそのメソッド内のコードをカプセル化しますか、それともメソッドのシグネチャをキャプチャしてそのように呼び出しますか?

self呼び出しクラスを指すと考えるべきです。

于 2011-01-13T15:15:55.283 に答える