消息在小谈话中传递,ObjectiveC与参数中的值类型(结构)的调用方法相同吗?

Muh*_*han 2 language-agnostic smalltalk language-design objective-c message-passing

根据维基百科,消息传递和调用方法之间的区别是"在消息传递中,每个参数必须有足够的可用额外内存,用于将现有参数复制到新消息的一部分",而在方法调用中只有地址参数的传递.

消息传递与调用常规方法的不同之处在于所有参数都是结构或值类型,即它们都必须完全在堆栈中推送,以便被调用者能够使用它们?

dre*_*wag 10

一旦进行了实际的函数调用,就没有区别.消息传递和调用方法之间的区别在于链接.对于像c和c ++这样的语言,函数调用在编译时与链接器链接(除了需要一些运行时支持的虚函数).对于使用诸如objective-c和smalltalk之类的消息传递系统的语言,您无法保证在运行时之前将运行哪些函数.运行时确定对象是否实际实现了消息中表示的函数.如果它没有实现它,该类通常会将消息转发到另一个对象,或抛出异常.但是,如果类确实实现了它,则运行时确定实际函数的地址,并以与c完全相同的方式调用它(将参数和返回地址压入堆栈).

总的来说,消息与直接调用方法是一回事,除了运行时发现要调用的确切函数而不是在编译时链接它.


bbu*_*bum 7

Objective-C调用ABI通常(如果你愿意,可以编写自己的ABI)100%纯C ABI; 参数和返回值的处理方式与普通C调用站点完全相同.

一个关键的区别是Objective-C调用站点总是被编译为变体,objc_msgSend()前两个参数始终是目标对象(self)和要调用的选择器(_cmd).这使得动态调度 - 在运行时覆盖方法的能力等 - 使Objective-C与C++(或类似)有很大不同.

对于你可能需要知道的更多objc_msgSend()(在运行时和编译器团队之外),我写了一个4部分系列,给出了一个按指导之旅objc_msgSend().