swift 对比 OC 的好处

2,100 阅读4分钟

swift 对比 OC

1、方法调度快

Swift将很多在运行时才可以确定的信息,在编译期就决定了。这就让Swift更加快速。
静态派发
  • 静态派发是指在运行时调用方法不需要查表,直接跳转到方法的代码中执行。
  • 静态派发是有条件的,方法内部的代码必须对编译器透明,并且在运行时不能被更改,这样编译器才能帮助我们。
  • Swift 中的值类型不能被继承,也就是说值类型的方法实现不能被修改或者被复写,因此值类型的方法满足静态派发的要求。
  • class 中将方法标记为。final 或者 private 就是静态调度
  • 内联是指在编译期把每一处方法调用替换为直接执行方法内部的代码,可以帮助你避免运行时方法调用的时间开销。
swift 动态派发
  • Swift中的类会创建一个V-Table,这个Table是一个数组,其中存放的是函数指针。子类会按照父类V-Table中函数的存放,如果子类没有覆盖某个方法,那么就会拷贝父类方法的地址,如上面的例子会得到下面的V-Table。
  • 将函数指针和Index所做的映射在编译期就确定了,这就大大减少了运行时的工作量,提高了运行速度。所以在运行时它没有必要知道是哪个类型的实例调用了这个方法,只需要找到相应的V-Table即可,至于是其中的哪个Index已经在编译期确定了,没必要再去查找Index的值。

2、结构体,枚举的好处

  • 值类型,存储在栈中,栈是一个简单的数据结构。通过移动栈顶的指针,就可以进行内存的创建和释放。
  • 线程安全,每次获取都需要copy一份,这样会避免别处代码修改对当前代码产生影响
  • 静态调度,值类型的方法实现不能被修改或者被复写,所以值类型的方法是静态调度的。

3、更安全

在Swift代码中的可选类型使得一个nil可选值的可能性变得非常的明确, 这意味它能在你写下一段糟糕的代码时会生成一个编译器错误. 这就建立了一种短程反馈的循环,可以让程序员带着目标去写代码. 问题在代码被写就时就可以被修复, 这大大节省了你要在修复有关来自 Objective-C 指针逻辑的bug时需要耗费的时间和金钱.

4、内存管理

Swift 以一种 Objective-C 从未有过的方式进行了统一。对自动引用计数 (ARC) 的支持是在整个过程化的和面向对象的代码路径上完成的。在。Objective-C。中, ARC 在 Cocoa API 和面向对象代码中获得支持;然而它并不支持过程式的 C 语言代码和像 Core Graphics 这样的 API。这意味着在使用 Core Graphics API 以及其它 iOS 上的底层 API 时,内存管控的处理都是程序员的责任。程序员在

5、代码简洁

Swift 减少了重复性语句和字符串操作所需要的代码量。在 Objective-C 中, 使用文本字符串将两块信息组合起来的操作非常繁琐。Swift 采用当代编程语言的特性,比如使用“+”操作符将两个字符串加到一起,这在 Objective-C 中是没有。像这样支持对字符和字串的组合对于任何要在屏幕上向用户展示文本的编程语言的基础设施。

Swift中的类型系统减少了代码语句的复杂性--作为编译器可以理解的类型。比如,Objective-C要求程序员记住特殊字符标记(%s,%d,%@)并且提供了一个用逗号分隔的变量来代替每个标记。Swift支持字符串插入,这就消除了需要记住的标记和允许程序员直接插入变量到面向用户的字符串中,比如标签或者按钮的标题。这类推理系统和字符串插入减少错误来源在Objective-C中都是很常见的。

6、命名空间

Swift 的命名空间是基于一份代码文件所属的目标位置。这就意味可以使用命名空间标识来区分出不同的类和值。Swift 中的这个改变很大,它极大的方便了将开发员项目、框架以及库集成到你代码中来的操作。命名空间使得在集成开源项目时,不用担心来自不同软件公司的同名代码文件会发生冲突。现在 Facebook 和苹果公司可以同时使用一个叫做 FlyingCar.swift 的对象代码文件,不会有任何错误或者失败。