使用字符串动态地调用Objective C


74

我只是想知道是否存在一种方法来调用方法,其中我使用字符串快速建立了方法的名称。

例如我有一个叫做loaddata的方法

-(void)loadData;

打电话给我,我通常会这样称呼它

[self loadData];

但我希望能够使用字符串动态调用它,例如

NSString *methodName = [[NSString alloc] initWithString:@"loadData"];
[self methodName];

这是一个愚蠢的例子,但我希望你明白我的意思。我将其用于为IPad应用程序设置的数据绑定类。很难解释,但要使其启动,我需要弄清楚如何使用字符串调用方法。

有任何想法吗?

谢谢


1
+1即可解决简单的问题!
Linuxmint 2010年

我要调用的方法是一个返回NSString的函数。
IPadHackAndSlash 2010年

Answers:


108

您可以尝试类似

SEL s = NSSelectorFromString(selectorName);
[anObject performSelector:s];

在这种情况下,在一种情况下,该方法返回一个为NSString的值。我收到一个错误消息,要求Lvalue作为赋值的左操作数。这是我的代码:SEL = NSSelectorFromString(@“ getIDString”); [自身文本] = [boundEntity performSelector:s];
IPadHackAndSlash 2010年

什么是[自身文本],您在其中分配值返回getIDString。
Ishu 2010年

[boundEntity performSelector:s]返回与类型不匹配的type值[self text]。我认为您需要为文本设置@property并致电[self setText:[[boundEntity performSelector:s]]]
shreyasva 2010年

9
performSelector可能会导致泄漏,因为选择器未知!
malhal 2013年


12

您可以使用objc_msgSend函数。它需要两个参数,接收方和选择方发送给它:

objc_msgSend(self, someSelector);

您需要使用以下命令将字符串转换为适当的选择器NSSelectorFromString

NSString *message = [self getSomeSelectorName];
objc_msgSend(self, message);

该方法还接受可变数量的参数,因此您可以发送带有任意数量参数的消息。

NSString *message = [self getSomeSelectorNameWithManyArguments];
objc_msgSend(self, message, arg1, arg2, arg3, arg4);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.