一、函数的派发方式
swift函数的派发机制有三类:static直接派发(静态)派发、table函数派发,message消息派发。
-
直接派发也称为静态派发,指令集少,还会进行编译优化(函数内联)
2.函数派发是实现动态行为最常见的方式,通过函数表里面的数组来存储类声明的每个函数指针,称为vitual table, swift里叫witness table
3.消息派发其实就是oc那套消息发送了,他是cocoa的基石。
二、结构体和类的区别
1.结构体属于值类型、类属于引用类型
2.值类型赋值给let var或函数传参数的时候全是深拷贝、引用类型这是拷贝内容指针浅拷贝。
3.结构体不能继承、类可以。
4.结构体的方法修改属性时候需要用@mutating修饰
5.结构体初始化的时候必须给属性赋值类决定结构体内存布局。
6.结构体声明属性时候不需要赋值,类声明属性的时候需要或者包装成Optional
7.required关键字只支持Class、Class可以用 static和 Class 修饰静态方法,结构体只能用Static
三、copy-on-write的理解
写时复制,在复制时,复制对象和原对象实际上在内存同一个位置,当且仅当修改复制对象是,才对在内存中创建新的地址保存该对象,这样能提升性能,Struct,String、Array、Dictionary、Set 都采用了这个技术
四、Swift 为什么要将String,Array ,Dictionary 设计为值类型
- 值类型比引用类型最大优势在于内存使用高效,值类型在栈上操作,引用类型在堆上操作。栈上操作仅仅是单个指针上下移动,而堆上操作会牵涉到合并,移位、重新链接等。这样设计就大幅减少了堆上内存分配和回收次数,同时使用copy-on-write又将值传递的复制开销降到最低。
- 线程安全考虑,通过let 设置,达到数据不变,解决多线程内存访问和操作问题。
- 提升了api灵活度,让我们可以方便的遍历String。