美文网首页
44、swift 类和结构体 && swift和OC的区别

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

作者: howhyone | 来源:发表于2023-02-12 13:34 被阅读0次

    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的区别

    1)Swift是强类型(静态)语言,有类型推断,Objective-C弱类型(动态)语言
    2)Swift面向协议编程,注重值类型,值类型可以遵守协议;Objective-C面向对象编程,注重引用类型,只有类可以遵守协议
    3)swift支持泛型,值类型和引用类型都可以;OC只支持给集合添加泛型,仅限在于引用类型
    4)Swift支持静态派发(效率高)、动态派发(函数表派发、消息派发)方式,Objective-C支持动态派发(消息派发)方式

    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
    静态调度

    相关文章

      网友评论

          本文标题:44、swift 类和结构体 && swift和OC的区别

          本文链接:https://www.haomeiwen.com/subject/eijvbrtx.html