使用[self method]或@selector(method)?

时间:2010-04-20 11:58:09

标签: iphone objective-c cocoa-touch

任何人都可以告诉我下面这两个陈述之间的区别。

[self playButtonSound];

[self performSelector:@selector(playButtonSound)];

我只是问,因为我有一些使用@selector的旧代码,现在有了更多的知识,我想不出为什么我没有使用[self playButtonSound],他们似乎都做了与此处写的一样。

加里

2 个答案:

答案 0 :(得分:10)

两者都是相同的,但[self playButtonSound];绝对是在Objective-C中调用方法的常规方法。但是,使用performSelector:可以调用仅在运行时确定的方法。

来自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];

答案 1 :(得分:6)

[self playButtonSound]; 

此处编译器将检查您的对象是否响应-playButtonSound消息,如果不响应则会发出警告。

[self performSelector:@selector(playButtonSound)];

以这种方式调用-playButtonSound您将不会收到编译器警告。但是,您可以动态检查对象是否响应给定的选择器 - 这样您就可以安全地尝试在对象上调用任意选择器而不指定其类型并且不会收到编译器警告(这可能对于调用对象委托中的可选方法很有用) :

if ([self respondsToSelector:@selector(playButtonSound)])
  [self performSelector:@selector(playButtonSound)];