加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 金华站长网 (https://www.0579zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Swift 5.0的Runtime机制浅析

发布时间:2019-07-18 18:38:39 所属栏目:业界 来源:欧阳大哥2013
导读:副标题#e# 导读:你想知道Swift内部对象是如何创建的吗?方法以及函数调用又是如何实现的吗?成员变量的访问以及对象内存布局又是怎样的吗?这些问题都会在这篇文章中得到解答。为了更好的让大家理解这些内部实现,我会将源代码翻译为用C语言表示的伪代码来实

如果是在Swift类的extension中定义的方法(重写OC基类的方法除外)。那么针对这个方法的调用总是会在编译时就决定,也就是说在调用这类对象方法时,方法调用指令中的函数地址将会以硬编码的形式存在。在extension中定义的方法无法在运行时做任何的替换和改变!而且方法函数的符号信息都不会保存到类的描述信息中去。这也就解释了在Swift中派生类无法重写一个基类中extension定义的方法的原因了。因为extension中的方法调用是硬编码完成,无法支持多态!下面的Swift源代码以及C伪代码实现说明了这个情况:

  1. ////////Swift源代码 
  2.  
  3. //类定义 
  4. class CA { 
  5.     open func foo(){} 
  6. } 
  7.  
  8. //类的extension定义 
  9. extension CA { 
  10.    open func extfoo(){} 
  11. } 
  12.  
  13. func main() { 
  14.   let obj = CA() 
  15.   obj.foo() 
  16.   obj.extfoo() 
  17. } 
  18.  
  19. ////////C伪代码 
  20.  
  21. //...........................................运行时定义部分 
  22.  
  23.  
  24. //Swift类描述。 
  25. struct  swift_class { 
  26.     ...   //其他的属性,因为这里不关心就不列出了。 
  27.    //虚函数表刚好在结构体的第0x50的偏移位置。 
  28.     IMP vtable[1]; 
  29. }; 
  30.  
  31.  
  32. //...........................................源代码中类的定义和方法的定义和实现部分 
  33.  
  34.  
  35. //类定义 
  36. struct CA { 
  37.       struct  swift_class *isa; 
  38. } 
  39.  
  40. //类的方法函数的实现定义 
  41. void foo(){} 
  42. //类的extension的方法函数实现定义 
  43. void extfoo(){} 
  44.  
  45. //类的描述信息构建,这些都是在编译代码时就明确了并且保存在数据段中。 
  46. //extension中定义的函数不会保存到虚函数表中。 
  47. struct swift_class classCA; 
  48. classCA.vtable[0] = {&foo}; 
  49.  
  50.  
  51. //...........................................源代码中程序运行的部分 
  52.  
  53. void main(){ 
  54.   CA *obj =  CA.__allocating_init(classCA) 
  55.   obj->isa = &classCA; 
  56.   asm("mov x20, obj"); 
  57.   //Swift中常规方法foo调用采用间接调用实现 
  58.   obj->isa->vtable[0](); 
  59.   //Swift中extension方法extfoo调用直接硬编码调用,而不是间接调用实现 
  60.   extfoo(); 
  61. } 

需要注意的是extension中是可以重写OC基类的方法,但是不能重写Swift类中的定义的方法。具体原因根据上面的解释就非常清楚了。

类中定义的常规方法

(编辑:PHP编程网 - 金华站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!