3

以下のコードを使用して以前に保存したメソッドを呼び出すにはどうすればよいですか?

SEL sel = @selector(someMethod:param:);
Method myMethod = class_getInstanceMethod([SomeClass class], sel);

ご想像のとおり、後で元のメソッドをスウィズルするため、呼び出し[SomeClass someMethod]は機能しません。

4

1 に答える 1

2

メソッドにはselfと_cmdの2つの暗黙の引数があることに注意して、適切な関数型へのポインターを型キャストする必要があります。Appleのランタイムドキュメントから:

void (*setter)(id, SEL, BOOL);

int i;

setter = (void (*)(id, SEL, BOOL))[target methodForSelector:@selector(setFilled:)];

for ( i = 0; i < 1000, i++ )
    setter(targetList[i], @selector(setFilled:), YES);

編集

メソッドタイプは構造体であり、ObjC2ランタイムでは不透明であるため、そのメンバーに直接アクセスできないことに注意method_getImplementation(myMethod)してください。上記のように型キャストできるIMPを取得するにはを使用する必要があります。

于 2011-06-20T14:58:57.500 に答える