【问题标题】:Objective C calling method dynamically with a stringObjective C用字符串动态调用方法
【发布时间】:2011-05-25 17:11:51
【问题描述】:

我只是想知道是否有一种方法可以调用一个方法,我可以在其中使用字符串动态构建方法的名称。

例如我有一个名为 loaddata 的方法

-(void)loadData;

我通常会这样称呼它

[self loadData];

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

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

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

有什么想法吗?

谢谢

【问题讨论】:

  • +1 表示清晰、简单的问题!
  • 我要调用的方法是一个返回NSString的函数。

标签: iphone objective-c dynamic methods messaging


【解决方案1】:

你可以试试

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

【讨论】:

  • 在这种情况下,该方法返回一个值,在一种情况下是一个 NSString。我收到一条错误消息,提示需要 Lvalue 作为赋值的左操作数。这是我的代码: SEL s = NSSelectorFromString(@"getIDString"); [self text] = [boundEntity performSelector:s];
  • 什么是[self text],在哪里赋值返回getIDString。
  • [boundEntity performSelector:s] 返回一个与[self text] 的类型不匹配的值。我认为您需要为文本设置@property 并调用[self setText:[[boundEntity performSelector:s]]]
  • performSelector 可能会导致泄漏,因为选择器未知!
【解决方案2】:

您可以使用 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);

【讨论】:

    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2012-04-08
    相关资源
    最近更新 更多