几乎是默写出来,加上自己理解的博客(iOS面试)
1.swift和oc函数调用的区别
- oc是动态,swift是静态(函数内联)
- Swift编译时就确定了方法的实现,oc是运行时才确定方法的实现
swift在编译是就确定了方法的实现,是通过动态派发和静态派发来实现的,参考底下掘金的博客
静态派发
- 静态派发是指在运行时调用方法不需要查表,直接跳转到方法的代码中执行。
- 静态派发是有条件的,方法内部的代码必须对编译器透明,并且在运行时不能被更改,这样编译器才能帮助我们。
- Swift 中的值类型不能被继承,也就是说值类型的方法实现不能被修改或者被复写,因此值类型的方法满足静态派发的要求。
- class 中将方法标记为。final 或者 private 就是静态调度
- 内联是指在编译期把每一处方法调用替换为直接执行方法内部的代码,可以帮助你避免运行时方法调用的时间开销。
动态派发
- Swift中的类会创建一个V-Table,这个Table是一个数组,其中存放的是函数指针。子类会按照父类V-Table中函数的存放,如果子类没有覆盖某个方法,那么就会拷贝父类方法的地址,如上面的例子会得到下面的V-Table。
- 将函数指针和Index所做的映射在编译期就确定了,这就大大减少了运行时的工作量,提高了运行速度。所以在运行时它没有必要知道是哪个类型的实例调用了这个方法,只需要找到相应的V-Table即可,至于是其中的哪个Index已经在编译期确定了,没必要再去查找Index的值。
2.swift不提倡使用runtime,有一个反射机制(Mirror)
Swift 中的 Reflection(反射) Mirror - apple developer Swift利用反射机制(Mirror)获取类的属性列表与值 - 简书 Swift 中的反射
参考博客
iOS之Swift和OC的区别 swift 对比 OC 的好处 - 掘金 Swift为什么将String、Array、Dictionary设计为值类型
|