评论

收藏

[iOS开发] iOS Swift结构体与类的方法调度

移动开发 移动开发 发布于:2021-10-15 17:37 | 阅读数:417 | 评论:0

前言
hello,小伙伴们:在忙碌中闲暇之余给大家聊聊swift的知识点,今天给大家带来的是swift中结构体与类的方法调度详细区别,希望对你有所帮助,好了废话不用多说,接下来步入主题!
1.普通方法时两者方法调度的区别
● 结构体中的普通方法调度是静态派发的方式
   ○ 详细分析会在以后: 方法调度之普通结构体方法 阐述
● 类中的普通方法是以函数派发的方式去调度的。
   ○ 详细分析会在以后:方法调度之普通方法 阐述
2.协议中两者方法调度的区别
● 以类/结构体直接声明的,
○ 结构体:方法调度都是静态调度
○ 类:方法调度都是函数调度
● 以协议类型声明的, 无论协议的实现是类还是结构体:
○ 方法最初定义在协议本身内, 则方法以协议函数表的方式调度
○ 方法最初定义在协议延展内, 则方法以静态派发的方式调度
3.extension对类中方法调度的影响
extension PersonClass {
  func changClassName10() {}
}
SIL代码:
DSC0000.png

DSC0001.png



断点,汇编跟踪一下:
DSC0002.png


可以看到 changClassName10 这个方法在执行的时候,由function_ref修饰,sil_vtable 中的函数列表里面没有。在编译时已经确定了函数的地址,运行时,直接执行。所以延展内的方法是静态派发。

DSC0003.png
DSC0004.png
DSC0005.png
DSC0006.png
DSC0007.png
DSC0008.png
DSC0009.png
DSC00010.png
DSC00011.png
DSC00012.png
DSC00013.png
DSC00014.png
DSC00015.png
DSC00016.png
DSC00017.png
DSC00018.png
DSC00019.png
DSC00020.png
DSC00021.png
DSC00022.png
DSC00023.png
DSC00024.png
关注下面的标签,发现更多相似文章