swift与oc的差异:
- swift语法更简洁
- 安全性更高,如可选型、值类型等
- 大量在oc是引用类型的对象,都改为了值类型。如数组、字典等。
- swift是一门静态语言,有别于oc的动态语言
- 枚举、泛型、协议具有更强的功能和更广泛的应用
- swift面向协议编程,oc面向对象编程
安全性:
可选型:swift引入可选型,保证类型安全。如Int?,他要么是有值,要么是nil。也就是把nil当做为一种类型。这样能避免我们手写不为空的判断,让编译器就能直接提醒报错,极大提升安全性。
值类型:swift把原本在oc为引用类型的对象改为了值类型。如Array,Dictionary。其目的不仅是更为轻量,也是处于安全目的考虑。当方法传递的时候,往往把引用类型传递进去后进行更改操作,往往不够安全,容易出现野指针访问。
类型确认:Array和Dictionary在定义的时候或推断的时候,就需要进行类型确认,保证集合里只有固定一种类型,以达到类型安全的目的。避免运行时出现类型不一致又缺少isKindOfClass的判断等。
写时复制(copy on write)
当一个不可变的值类型实例被赋值给一个新的变量或常量时,原始值的引用计数会增加。这样,原始值和新的变量或常量共享同一个内存。当进行第一次修改操作时,Copy-on-Write 机制会检查原始值的引用计数。如果引用计数为 1,表示该值没有被共享,可以直接进行修改。但如果引用计数大于 1,表示该值被多个引用共享,此时会进行复制操作,创建一个新的副本,并将修改操作应用在副本上,而不是原始值上。
派发机制
静态派发:指在运行时不需要查表,直接跳转到方法进行执行。静态派发的性能也是最高的。c语言采用的是直接派发。
函数表派发:class类型采用函数表派发。当一个对象调用一个函数时,会从对象的头8字节找到该对象的元信息。从元信息的函数表中找到执行的函数地址,并执行函数。
消息派发:即oc的消息发送。