Snow Leopardのblockのクラス階層

どうやらblockはオブジェクトらしい。クラス階層を追ってみた。

単純なblock

int (^test)(int a, int b);

test = ^(int a, int b) {
    return a * b;
};

Class c = [test class];
while(c) {
    NSLog(@"%@", [c description]);
    c = [c superclass];
}

結果

__NSGlobalBlock__
__NSGlobalBlock
NSBlock
NSObject

blockの外のスコープの変数を参照してみると別クラスに変わった。

int n = 3;
int (^test)(int a, int b);

test = ^(int a, int b) {
    return a * b * n;
};

Class c = [test class];
while(c) {
    NSLog(@"%@", [c description]);
    c = [c superclass];
}

NSLog(@"test(3, 4) = %d", test(3, 4));

結果

__NSStackBlock__
__NSStackBlock
NSBlock
NSObject
test(3, 4) = 36

__blockとか使ってるとまた変わるのかも。