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

Swift 5.0的Runtime机制浅析

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

2. 就是对多态的支持,也可能不是通过虚函数来处理了,而是通过类型判断采用条件语句来实现方法的调用。就比如下面Swift语言源代码和C语言伪代码:

  1. ////////Swift源代码 
  2.  
  3. //基类 
  4. class CA{ 
  5.    @inline(never) 
  6.    open func foo(){} 
  7. } 
  8.  
  9. //派生类 
  10. class CB:CA{ 
  11. @inline(never) 
  12. override open func foo(){} 
  13. } 
  14.  
  15. //全局函数接收对象作为参数 
  16. @inline(never) 
  17. func testfunc(_ obj:CA){ 
  18.     obj.foo() 
  19. } 
  20.  
  21.  
  22. func main() { 
  23.   //对象的创建以及方法调用 
  24.   let objA = CA() 
  25.   let objB = CB() 
  26.   testfunc(objA) 
  27.   testfunc(objB) 
  28. } 
  1. ////////C伪代码 
  2.  
  3. //...........................................运行时定义部分 
  4.  
  5.  
  6. //Swift类描述 
  7. struct swift_class { 
  8.     ...   //其他的属性,因为这里不关心就不列出了 
  9.     //这里也没有虚表的信息。 
  10. }; 
  11.  
  12.  
  13. //...........................................源代码中类的定义和方法的定义和实现部分 
  14.  
  15. //类定义 
  16. struct CA { 
  17.       struct swift_class *isa; 
  18. }; 
  19.  
  20. struct CB { 
  21.    struct swift_class *isa; 
  22. }; 
  23.  
  24. //Swift类的方法的实现 
  25. //基类CA的foo方法实现 
  26. void fooForA(){} 
  27. //派生类CB的foo方法实现 
  28. void fooForB(){} 
  29. //全局函数方法的实现 
  30. void testfunc(CA *obj) 
  31. { 
  32.     //这里并不是通过虚表来进行间接调用而实现多态,而是直接硬编码通过类型判断来进行函数调用从而实现多态的能力。 
  33.     asm("mov x20, obj"); 
  34.     if (obj->isa == &classCA) 
  35.          fooForA(); 
  36.     else if (obj->isa == &classCB) 
  37.         fooForB(); 
  38. } 
  39.  
  40. //类的描述信息构建,这些都是在编译代码时就明确了并且保存在数据段中。 
  41. struct swift_class classCA; 
  42. struct swift_class classCB; 
  43.  
  44. //...........................................源代码中程序运行的部分 
  45.  
  46. void main() { 
  47.   //对象实例创建以及方法调用的代码。 
  48.   CA *objA = CA.__allocating_init(classCA); 
  49.   objA->isa = &classCA; 
  50.   CB *objB = CB.__allocating_init(classCB); 
  51.   objB->isa = &classCB; 
  52.   testfunc(objA); 
  53.   testfunc(objB); 
  54. } 

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

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