通过Apache Cordova的源代码,我遇到了两行我感到困惑的代码:

    //[obj performSelector:normalSelector withObject:command];
    objc_msgSend(obj,normalSelector,command);

从Apple的文档来看,这两种方法之间似乎并没有太大的区别。

id objc_msgSend(id theReceiver,SEL theSelector,...)
将带有简单返回值的消息发送到类的实例。

-(id)performSelector:(SEL)aSelectorwithObject:(id)anObject
使用对象作为参数将消息发送到接收方。 (必需的)

这两种方法之间到底有什么区别?在上述情况下,两者都以对象为对象向接收对象发送消息。

最佳答案

您是在问两种“方法”之间的区别,但实际上只有一种是方法。 objc_msgSend函数是一个函数。不是一种方法。
objc_msgSend函数是在Objective C中的任何对象上调用任何方法时实际上调用的函数。例如,以下两个基本上等效:

// This is what the compiler generates
objc_msgSend(obj, @selector(sel:), param);

// This is what you write
[obj sel:param];

// You can check the assembly output, they are *almost* identical!

此处的主要区别在于objc_msgSend不会由编译器检查类型-至少,它的参数不会与选择器的参数类型进行类型检查。因此,以下内容大致相同:
[obj performSelector:normalSelector withObject:command];
objc_msgSend(obj, @selector(performSelector:withObject:),
             normalSelector, command);

但是,这有点浪费,因为performSelector:withObject:所做的只是调用objc_msgSend

但是:如上所述,您应该远离obc_msgSend,因为它不是类型安全的。 apache开发人员所做的全部工作就是删除一个方法调用,这在大多数情况下只会给您带来很小的性能优势。

10-07 19:56
查看更多