开发者

Using [self method] or @selector(method)?

开发者 https://www.devze.com 2022-12-27 06:54 出处:网络
Can anyone enlighten me as to the differences between the two statements below. [self playButtonSound];

Can anyone enlighten me as to the differences between the two statements below.

[self playButtonSound];

AND:

[self performSelector:@selector(playButtonSound)];

I am just asking as I had some old code that used @selector, now with a little more knowl开发者_运维问答edge I can't think why I did not use [self playButtonSound] instead, they both seem to do the same as written here.

gary


Both to the same thing, but [self playButtonSound]; is definitely the normal way to invoke a method in Objective-C. However, using performSelector: allows you to call a method that is only determined at runtime.

From the NSObject Protocol Reference:

The performSelector: method is equivalent to sending an aSelector message directly to the receiver. For example, all three of the following messages do the same thing:

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

However, the performSelector: method allows you to send messages that aren’t determined until runtime. A variable selector can be passed as the argument:

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


[self playButtonSound]; 

Here compiler will check if your object responds to -playButtonSound message and will give you a warning if it does not.

[self performSelector:@selector(playButtonSound)];

Calling -playButtonSound this way you will not get compiler warning. However you can check dynamically if objects responds to a given selector - so you can safely attempt to call arbitrary selector on a object without specifying its type and not getting compiler warnings (that may be useful for example for calling optional methods in a objects delegate):

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

精彩评论

暂无评论...
验证码 换一张
取 消