1、swift 类和结构体
1、默认初始化方法
1)结构体:为了让属性都有初始化值,默认初始化方法可以带参数的
2)类:默认初始化方法不携带参数
2、类型不同
1)结构体:值类型:不可以继承;内容存放在 全局,堆,栈都有可能;赋值操作,互不影响,let 类型的结构体变量(内存不可修改),其属性不能修改,属性放在结构体的内存中;内部的属性如果想要修改,在内部的修改方法前加 mutating
struct mutatingStruct {
var testV: Int = 10
mutating func mutatingFunc(param: Int) {
testV = param;
}
}
2)类:引用类型:可以继承;内容存放在堆 ;赋值操作:一处修改,其他地方也被修改;let 类型的类 变量(内存不可以修改),其var属性能修改
3)、方法调度不同
结构体是直接调度
类一般是方法表调度,static和final或者类的扩展是直接调度,@objc dynamic 修饰是消息调度(objc_msgSend)
2、swift和OC的区别
Swift调研
1)Swift是强类型(静态)语言,有类型推断,Objective-C弱类型(动态)语言
2)Swift面向协议编程,注重值类型,值类型可以遵守协议;Objective-C面向对象编程,注重引用类型,只有类可以遵守协议
3)swift支持泛型,值类型和引用类型都可以;OC只支持给集合添加泛型,仅限在于引用类型
4)Swift支持静态派发(效率高)、动态派发(函数表派发、消息派发)方式,Objective-C支持动态派发(消息派发)方式
5)Swift文件引用通过swiftModule方式,提高变异效率,OC可以是pch,hmap, #import等
3、swift 调度方式
结构体:静态调度(直接调度)
编译连接之后生成方法对应的地址, 直接调用地址,效率会很高
类:类中声明的⽅法是通过 V-table 来进⾏调度的
特殊情况:
1、extension添加的方法:静态调度,直接调用方法地址
2、@objc
依旧是添加到sil_vTable中调度
除了生成swift的方法外,会多生成一个供OC调用的方法,
供OC调用的方法内部 调用swift的该方法
3、dynamic
dynamic func teach() {
print("teach")
}
告诉编译器这个方法是可能被动态调用的,需要将其添加到查找表中,具有OC方法的特性
使用dynamic关键字标记属性,使属性启用Objc的动态转发功能;
dynamic只用于类,不能用于结构体和枚举,因为它们没有继承机制,而Objc的动态转发就是根据继承关系来实现转发。
4、 @objc dynamic
@objc dynamic func teach() {
print("teach")
}
方法调用使用msg_send,方法不存放在sil_vTable中
5、final、static
静态调度