我如何dynamic创build一个select器在运行时与Objective-C?
我知道如何使用@selector(MyMethodName:)
在编译时创build一个SEL
,但是我想要做的是从NSString
dynamic地创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];