クラスメソッドを@selectorで呼び出せないかな
— 進藤こだまさん (@kodam) 3月 22, 2012
というツイートを見かけたので、備忘で書いておきます。
- パラメータとかが短くて簡単な場合
- パラメータ複数だったりして面倒な場合
[[UIApplication class] performSelector:@selector(sharedApplication)];
簡単ですね。
// id target=[UIApplication class];//でもOK
id target = NSClassFromString(@"UIApplication");
// SEL selector = @selector(sharedApplication);//でもOK
SEL selector = NSSelectorFromString(@"sharedApplication");
[[UIApplication class] performSelector:@selector(sharedApplication)];
NSMethodSignature *sig = [target methodSignatureForSelector:selector];
if (sig) {
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
inv.target = target;
inv.selector = selector;
if (inv) {
// パラメータがあればしたの様に設定
// [inv setArgument:&condition atIndex:2];
// [inv setArgument:&orderby atIndex:3];
[inv invoke];
id retval;
[inv getReturnValue:&retval];
NSLog(@"%@",[retval description]);
}
}
NSInvokationを使えば、複雑なメソッドも発行出来ます。文字列からクラスを作成することも出来ますし、文字列からセレクタを作成する事も、複数のパラメータを渡すことも出来ます。パラメータを渡すときは、Index:2から開始なので用心を。
以上です。Objecive-Cは、実行バイナリにも、関数名、クラス名を持っているため、実行時に文字列組み替えでクラスを扱うことも出来るので、状況によっては、柔軟なプログラムを作成することが出来ます。