我如何dynamic创build一个select器在运行时与Objective-C?

我知道如何使用@selector(MyMethodName:)在编译时创build一个SEL ,但是我想要做的是从NSStringdynamic地创build一个select器。 这甚至有可能吗?

我可以做什么:

 SEL selector = @selector(doWork:); [myobj respondsToSelector:selector]; 

我想做什么:(伪代码,这显然不起作用)

 SEL selector = selectorFromString(@"doWork"); [myobj respondsToSelector:selector]; 

我一直在searchApple API文档,但还没有find一种不依赖于编译时@selector(myTarget:)语法的方法。

我不是一个Objective-C程序员,只是一个同情者,但也许NSSelectorFromString是你所需要的。 在“ 运行时引用”中提到了明确性,您可以使用它将string转换为select器。

根据XCode文档,你的伪代码基本上是正确的。

使用@selector()指令在编译时将值赋给SELvariables是最有效的。 但是,在某些情况下,程序可能需要在运行时将string转换为select器。 这可以用NSSelectorFromString函数完成:

setWidthHeight = NSSelectorFromString(aBuffer);

编辑:无赖,太慢了。 :P

我不得不说, 比以前受访者的回答可能提出的要复杂一点,如果你真的想创造一个select者 ,而不是只是“打电话给你” 。

你需要创build一个函数指针,这个函数指针将被你的“new”方法所调用,所以对于像[self theMethod:(id)methodArg];这样的方法[self theMethod:(id)methodArg]; ,你会写…

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

然后你需要dynamic地生成IMP块,这次传递“self”, SEL和任何参数。

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

并将其添加到您的类,以及整个吸盘(在这种情况下, "v@:@" ,void返回,对象调用者,对象参数)的准确方法签名,

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

你可以在这里看到一些这样的运行时间恶作剧的例子。

我知道这个答案很久以前,但我仍然想分享。 这也可以使用sel_registerName来完成。

问题中的示例代码可以像这样重写:

 SEL selector = sel_registerName("doWork:"); [myobj respondsToSelector:selector];