1

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

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

在我的代码的某一点上,我存储了对对象和方法的引用,这样做:

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

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

[myObject doSomething:self];

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

谢谢

4

2 回答 2

3

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

转换选择器:

SEL selector = NSSelectorFromString(methodSelectorString);

调用方法:

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

来自基金会参考

NSSelectorFromString

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

SEL NSSelectorFromString (
   NSString *aSelectorName
);

参数

aSelectorName

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

讨论 为了创建一个选择器,NSSelectorFromString 将 aSelectorName 的 UTF-8 编码字符表示传递给 sel_registerName 并返回该函数返回的值。因此,请注意,如果选择器不存在,它会被注册并返回新注册的选择器。

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


NSStringFromSelector

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

NSString *NSStringFromSelector (
   SEL aSelector
);
于 2013-02-25T12:47:07.357 回答
1

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

您可以使用以下代码:

SEL selector = NSSelectorFromString(myMethod);
if(selector)
{
   [myObject performSelector:selector withObject:self];
}
于 2013-02-25T12:58:26.437 回答