第十二章:双城记 —— OC vs Swift

12.1 安全感 vs 自由度

Swift 是一门安全的语言。 它有 Optional,逼着你处理 nil。 它有强类型检查,逼着你不能乱转类型。 它像一个控制欲极强的妈,把刀具(指针)都收起来,把桌角都包上软垫,生怕你伤着自己。

Objective-C 是一门自由的语言。 它给你一把枪(指针),告诉你枪口不要对着脚,然后就去喝咖啡了。 如果你真的对着脚开了一枪(Crash),那是你自己的问题。 id 甚至可以容纳一切。

12.2 值类型 vs 引用类型

Swift 推崇 Struct(值类型)。 你复制一份,就是真的复制了一份。修改 A 不会影响 B。 这减少了很多多线程竞争的问题。

OC 只有 Class(引用类型)。 所有的对象都在堆(Heap)上。 你传过去的是一个指针。如果不小心,你在 A 线程改了对象的属性,B 线程可能直接崩给你看。 所以 OC 里我们在多线程环境下通过 copy 属性或锁来保命。

12.3 动态派发 vs 静态派发

Swift 默认尽可能使用 Static Dispatch。 方法调用在编译时就确定了地址,速度飞快,编译器能做大量优化(内联)。

OC 永远是 Dynamic Dispatch(消息发送)。 它慢,但它灵活。 这也是为什么 Swift 的库很难 Mock,而 OC 的库随便 Swizzle 一下就能 Mock 的原因。

12.4 总结

Swift 是未来,是工业化、标准化的产物。 Objective-C 是过去,是手工艺、即兴发挥的爵士乐。 它们没有谁好谁坏,只有适不适合。 但是在今天,新项目首选 Swift 已经是不争的共识。

使用 Hugo 构建
主题 StackJimmy 设计