Objective-C中使用动态绑定,但如何?
-
18-09-2019 - |
题
我知道目标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 ++是相似的,除了代替具有消息表的类,它已别的东西被称为“虚函数表”,并且在调用的方法不经由文本字符串,但通过其偏移量虚表。这是静态绑定的一种形式,并且稍微加快执行,但比动态较少柔性结合。
不隶属于 StackOverflow