在iOS中使用performSelector有什么用

时间:2012-07-18 10:39:22

标签: ios objective-c

对于 performSelector ,我有点困惑。我已经在谷歌搜索了。但我不清楚。任何人都可以解释 performSelector 的作用。

感谢

[self btnClicked];

[self performSelector:@selector(btnClicked)]; 


-(void)btnClicked
{

    NSLog(@"Method Called";
}
对我来说,两人都很好。这两者有什么区别。 [self btnClicked][self performSelector:@selector(btnClicked)];

5 个答案:

答案 0 :(得分:10)

这两个在使用时非常相同,但后者的优势在于您可以动态确定在运行时调用哪个选择器。

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

[Source]

答案 1 :(得分:8)

Apple doc是你的朋友。

NSObject Protocol Reference

  

将指定的消息发送到接收方并返回结果   消息。

特别是:

  

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的。

希望有所帮助。

答案 2 :(得分:5)

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

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

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

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

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

[myTimer scheduleWithTarget:self andSelector:@selector(myCompletion)];

答案 3 :(得分:2)

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

NSSelectorFromString()

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

答案 4 :(得分:1)

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