使用字符串中的对象运行方法

Posted

技术标签:

【中文标题】使用字符串中的对象运行方法【英文标题】:running a method with object from a string 【发布时间】:2013-02-25 12:43:58 【问题描述】:

在我的代码中,我将方法引用为字符串,并且我有它们的目标。例如,假设我有一个名为 myObject 的对象,并且我有一个名为“doSomething:”的方法,如下所示:

- (void)doSomething:(id)sender 
   // do something baby

在我的代码中,我存储了对对象和方法的引用:

NSString *myMethod = @"doSomething:";
id myTarget = myObject;

稍后,在代码的另一点我想这样做

[myObject doSomething:self];

但是如何从对象的引用 id 和表示该方法的 NSString 重构对该对象的方法调用,以及如何将 self 传递给该方法?

谢谢

【问题讨论】:

提示:你想创建一个“选择器”。 使用NSSelectorFromString,查看documentation 【参考方案1】:

要将字符串转换为选择器,请使用NSSelectorFromString。反之,请使用NSStringFromSelector

转换选择器:

SEL selector = NSSelectorFromString(methodSelectorString);

调用方法:

[myObject performSelector:selector withObject:self afterDelay:0.0];

来自Foundation reference;

NSSelectorFromString

返回具有给定名称的选择器。

SEL NSSelectorFromString (
   NSString *aSelectorName
);

参数

aSelectorName

代表姓名的任意长度、任意字符的字符串 的选择器。返回值 aSelectorName 命名的选择器。如果 aSelectorName 为 nil,或无法转换为 UTF-8(这应该是 仅由于内存不足),返回 (SEL)0。

讨论要制作一个选择器,NSSelectorFromString 传递一个 UTF-8 aSelectorName 到 sel_registerName 的编码字符表示 并返回该函数返回的值。因此,请注意, 如果选择器不存在,则它被注册并且 返回新注册的选择器。

回想一下,冒号(“:”)是方法名的一部分; setHeight 不是 与 setHeight: 相同。有关方法名称的更多信息,请参阅“对象、 Objective-C 编程语言中的类和消息传递。


NSStringFromSelector

返回给定选择器的字符串表示形式。

NSString *NSStringFromSelector (
   SEL aSelector
);

【讨论】:

所以?将字符串转换为选择器后,如何调用该对象上的方法,将 self 作为对象传递?【参考方案2】:

正如@Till 所说,您需要使用NSSelectorFromString()

您可以使用以下代码:

SEL selector = NSSelectorFromString(myMethod);
if(selector)

   [myObject performSelector:selector withObject:self];

【讨论】:

以上是关于使用字符串中的对象运行方法的主要内容,如果未能解决你的问题,请参考以下文章

第三次过程性考核

JS中的常用内置对象有哪些?并列举该对象的常用方法?

JAVA 字符串比较: equals() 与 ==

JDK1.8字符串常量池里存的是String对象还是引用?

python builder方法是做啥用的

面对对象-继承-Object类