7

performSelector的作用是什么?

比较:

[self btnClicked];

[self performSelector:@selector(btnClicked)];

-(void)btnClicked
{
    NSLog(@"Method Called");
}

两者都对我来说很好。这两者有什么区别。[self btnClicked][self performSelector:@selector(btnClicked)];

4

5 回答 5

10

正如您所演示的那样,两者在使用时完全相同,但后者的优点是您可以动态确定在运行时调用哪个选择器。

SEL selector = [self gimmeASelectorToCall];
[self performSelector: selector];

[资源]

于 2012-07-18T10:42:36.073 回答
8

苹果文档是你的朋友。

NSObject 协议参考

向接收者发送指定的消息并返回消息的结果。

尤其是:

performSelector:方法相当于直接向接收者发送一个 aSelector 消息。例如,以下所有三个消息都执行相同的操作:

id myClone = [anObject copy];
id myClone = [anObject performSelector:@selector(copy)];
id myClone = [anObject performSelector:sel_getUid("copy")];

但是, performSelector: 方法允许您发送直到运行时才确定的消息。变量选择器可以作为参数传递:

SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation();
[anObject performSelector:myMethod];

aSelector 参数应该标识一个不带参数的方法。对于返回对象以外的任何东西的方法,请使用 NSInvocation。

希望有帮助。

于 2012-07-18T10:50:28.837 回答
5

selector对象允许您调用编译时不知道的方法。您只需要知道作为字符串的方法的名称即可调用它。

当您正在调用的方法的名称在编译时已知时,使用选择器会适得其反:代码变得不那么可读,没有明显的优势。当您编写的库需要调用与库分开编译的其他代码中的方法时,选择器提供了一种将两段代码解耦的方法。

例如,如果您正在编写一个可以在时间间隔结束时回调您的计时器类,您的计时器不知道它需要调用的函数的名称,因此它不能编写如下内容:

// We do not know if the function is called intervalHasExpired or something else
[target intervalHasExpired];

但是如果你给你的定时器一个选择器,定时器就可以给你回电话。

[myTimer scheduleWithTarget:self andSelector:@selector(myCompletion)];
于 2012-07-18T10:43:01.227 回答
2

PerformSelector 基本上允许您决定在运行时(后期绑定)传递什么消息,而不是像普通 C 这样的语言。如果您知道目标 C 类中方法的名称,则可以使用

NSSelectorFromString()

要将字符串转换为选择器,并让您的类使用 performSelector 调用该选择器。这样,您可以在运行时选择不同的函数来调用。您甚至可以使用配置文件选择要调用的函数。

于 2012-07-18T10:48:12.617 回答
1

performSelector调用已在类中声明和实现的方法。当您需要将代码中的操作附加到事件时使用它。

于 2012-07-18T10:41:10.170 回答