gpt4 book ai didi

Objective-C 的 "obj performSelector"vs objc_msgSend( )?

转载 作者:技术小花猫 更新时间:2023-10-29 10:59:32 24 4
gpt4 key购买 nike

在查看 Apache Cordova 的源代码时,我遇到了两行令我感到困惑的代码:

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

从苹果的文档来看,这两种方式似乎没有太大区别。

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 开发人员所做的只是删除单个方法调用,这在大多数情况下只会给您带来非常轻微的性能优势。

关于Objective-C 的 "obj performSelector"vs objc_msgSend( )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12241596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com