ページ

2010年1月4日月曜日

メソッドを関数のように呼び出す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

ADC に日本語解説あり。

Objective-C 2.0プログラミング言語: メソッドアドレスの取得

例えば -[NSImage setFlipped:YES] の呼び出しはこんな感じ。

void(*func1)(id, SEL, BOOL);
NSImage aImage = ...;

func1 = (void(*)(id, SEL, BOOL))[aImage methodForSelector:@selector(setFlipped:)];
func1(aImage, @selector(setFlipped:), YES);


戻り値がある時は? -[NSString componentsSeparatedByString:] を例にコーディングしてみる。こんな感じ。


NSString* str = @"CAT DOG MONKEY";

NSArray* (*func1)(id, SEL, NSString*);
func1 = (NSArray* (*)(id, SEL, NSString*))[str methodForSelector:
    @selector(componentsSeparatedByString:)];
NSArray* items = func1(str, @selector(componentsSeparatedByString:), @" ");

NSLog(@"%@", items);


実行結果(デバッガコンソール)




(
    CAT,
    DOG,
    MONKEY
)



-[methodForSelector:] の代わりに +[instanceMethodForSelector:] も使える。

func1 = (NSArray* (*)(id, SEL, NSString*))[NSString instanceMethodForSelector:@selector(componentsSeparatedByString:)];



(参考)メソッドと関数呼び出しの内部