加入收藏 | 设为首页 | 会员中心 | 我要投稿 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. class CB:CA{ 
  10. @inline(never) 
  11. override open func foo(){} 
  12.  
  13. //全局函数接收对象作为参数 
  14. @inline(never) 
  15. func testfunc(_ obj:CA){ 
  16.     obj.foo() 
  17.  
  18.  
  19. func main() { 
  20.   //对象的创建以及方法调用 
  21.   let objA = CA() 
  22.   let objB = CB() 
  23.   testfunc(objA) 
  24.   testfunc(objB) 
  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.     asm("mov x20, obj"); 
  33.     if (obj->isa == &classCA) 
  34.          fooForA(); 
  35.     else if (obj->isa == &classCB) 
  36.         fooForB(); 
  37.  
  38. //类的描述信息构建,这些都是在编译代码时就明确了并且保存在数据段中。 
  39. struct swift_class classCA; 
  40. struct swift_class classCB; 
  41.  
  42. //...........................................源代码中程序运行的部分 
  43.  
  44. void main() { 
  45.   //对象实例创建以及方法调用的代码。 
  46.   CA *objA = CA.__allocating_init(classCA); 
  47.   objA->isa = &classCA; 
  48.   CB *objB = CB.__allocating_init(classCB); 
  49.   objB->isa = &classCB; 
  50.   testfunc(objA); 
  51.   testfunc(objB); 

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

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