使用字符串中的对象运行方法
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];
【讨论】:
以上是关于使用字符串中的对象运行方法的主要内容,如果未能解决你的问题,请参考以下文章