How can I dynamically create a selector at runtime with Objective-C?

前端 未结 4 1158
北海茫月
北海茫月 2020-12-07 13:59

I know how to create a SEL at compile time using @selector(MyMethodName:) but what I want to do is create a selector dynamically from an NSSt

4条回答
  •  生来不讨喜
    2020-12-07 14:39

    I'd have to say that it's a little more complicated than the previous respondents' answers might suggest... if you indeed really want to create a selector... not just "call one" that you "have laying around"...

    You need to create a function pointer that will be called by your "new" method.. so for a method like [self theMethod:(id)methodArg];, you'd write...

    void (^impBlock)(id,id) = ^(id _self, id methodArg) { 
         [_self doSomethingWith:methodArg]; 
    };
    

    and then you need to generate the IMP block dynamically, this time, passing, "self", the SEL, and any arguments...

    void(*impFunct)(id, SEL, id) = (void*) imp_implementationWithBlock(impBlock);
    

    and add it to your class, along with an accurate method signature for the whole sucker (in this case "v@:@", void return, object caller, object argument)

     class_addMethod(self.class, @selector(theMethod:), (IMP)impFunct, "v@:@");
    

    You can see some good examples of this kind of runtime shenanigans, in one of my repos, here.

提交回复
热议问题