对于 performSelector ,我有点困惑。我已经在谷歌搜索了。但我不清楚。任何人都可以解释 performSelector 的作用。
感谢
[self btnClicked];
和
[self performSelector:@selector(btnClicked)];
-(void)btnClicked
{
NSLog(@"Method Called";
}
对我来说,两人都很好。这两者有什么区别。 [self btnClicked]
和[self performSelector:@selector(btnClicked)]
;
答案 0 :(得分:10)
这两个在使用时非常相同,但后者的优势在于您可以动态确定在运行时调用哪个选择器。
SEL selector = [self gimmeASelectorToCall];
[self performSelector: selector];
答案 1 :(得分:8)
Apple doc是你的朋友。
它
将指定的消息发送到接收方并返回结果 消息。
特别是:
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
调用已在类中声明和实现的方法。当您需要将代码中的操作附加到事件时使用它。