44、swift 类和结构体 && swift和OC的区别

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 来进⾏调度的

image.png

特殊情况:
1、extension添加的方法:静态调度,直接调用方法地址
image.png

2、@objc
依旧是添加到sil_vTable中调度
除了生成swift的方法外,会多生成一个供OC调用的方法,
供OC调用的方法内部 调用swift的该方法
image.png

image.png

3、dynamic
dynamic func teach() {
print("teach")
}
image.png

告诉编译器这个方法是可能被动态调用的,需要将其添加到查找表中,具有OC方法的特性
使用dynamic关键字标记属性,使属性启用Objc的动态转发功能;
dynamic只用于类,不能用于结构体和枚举,因为它们没有继承机制,而Objc的动态转发就是根据继承关系来实现转发。
4、 @objc dynamic

    @objc dynamic func teach() {
        print("teach")
    }

方法调用使用msg_send,方法不存放在sil_vTable中
5、final、static
静态调度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容