通过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开发人员所做的全部工作就是删除一个方法调用,这在大多数情况下只会给您带来很小的性能优势。