[Objecvice-C]クラスに対して任意のメソッドを実行する方法


というツイートを見かけたので、備忘で書いておきます。

  • パラメータとかが短くて簡単な場合

  • [[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は、実行バイナリにも、関数名、クラス名を持っているため、実行時に文字列組み替えでクラスを扱うことも出来るので、状況によっては、柔軟なプログラムを作成することが出来ます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください