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