我知道目标C使用动态所有方法调用的结合。这是如何实现的?在编译之前是否Objective-C的“转成C代码”,只需使用(无效*)指针的一切?

有帮助吗?

解决方案

从概念上讲,正在发生的事情是,有一个调度程序库(通常被称为目标C运行时),并且编译器转换是这样的:

[myObject myMethodWithArg:a andArg:b ];

//Not exactly correct, but close enough for this
objc_msgSend(myObject, "myMethodWithArg:andArg:", a, b);

和然后与所有的结合和调度运行时的交易,找到合适的功能,以及与这些ARGS调用它。简单地你可以认为它有点像哈希查找;当然它是更复杂,然后在现实中。

有相关类似的方法签名的东西(所以运行时需要处理其C不编码类型)。

多了很多问题

其他提示

每个目标C的方法被实现为(实际上)C函数“引擎盖下”。该方法具有与它相关联的消息(文本串),并且类具有与C函数消息字符串相匹配的查找表。因此,当你调用一个Objective C的方法,到底发生了什么是你发送消息字符串对象,该对象查找其类的方法查找表关联的C函数并运行。

有更将其与目标C,喜欢的对象是如何处理他们不转发他们,他们如何缓存消息到方法查找,等了解的消息,但是这是基础。

C ++是相似的,除了代替具有消息表的类,它已别的东西被称为“虚函数表”,并且在调用的方法不经由文本字符串,但通过其偏移量虚表。这是静态绑定的一种形式,并且稍微加快执行,但比动态较少柔性结合。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top