Blocksを調べよう!

まず、BlocksがObjctive-cオブジェクトだって事でそのクラスを調べよう!

- (void)printClassHierarchy:(id)object
{
	NSMutableArray *names = [NSMutableArray array];
	Class objClass = [object class];
	Class rootClass = [NSObject class];
	while(objClass != rootClass) {
		[names addObject:NSStringFromClass(objClass)];
		objClass = [objClass superclass];
	}
	[names addObject:NSStringFromClass(rootClass)];
	
	id reverseEnum = [names reverseObjectEnumerator];
	int i = 0;
	for(NSString *name in reverseEnum) {
		fprintf(stderr, "%*s%s\n", i++ * 4, " ", [name UTF8String]); 
	}
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{	
	void (^test)(void);
	test = ^{
		fprintf(stderr, "hogeeeeee!!!!\n");
	};
	[self printClassHierarchy:test];
}

結果。

 NSObject
    NSBlock
        __NSStackBlock
            __NSStackBlock__

うむ。Objective-Cのオブジェクトだ。


ならば、あれが出来るはず。そう、メーッセージ送信。クラス名は分かったけど、こんなの変えられても文句言えないのでNSObjectをカテゴライズします。

@interface NSObject(BlocksAddition)
- (void)dispatchAsync;
@end
@implementation NSObject(BlocksAddition)
- (void)dispatchAsync
{
	dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
	dispatch_async(queue, (dispatch_block_t)self);
}
@end

で、先ほどの-applicationDidFinishLaunching:に追加

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{	
	void (^test)(void);
	test = ^{
		fprintf(stderr, "hogeeeeee!!!!\n");
	};
	[self printClassHierarchy:test];
	
	[test dispatchAsync];
}

で、結果。

 NSObject
    NSBlock
        __NSStackBlock
            __NSStackBlock__
hogeeeeee!!!!

ちゃんとホゲてます!

Objective-C最強w