iOS——Objective-C与Swift优缺点对比

最近有个朋友(同事)在找工作,一起讨论关于面试过程中的面试题,有不少关于Objective-C的技术问题,尤其是关于一些技术的底层实现,当然这个在之前的文章中有整理.

其中有一个问题就是关于Objective-C和Swift区别,与优缺点的对比,由于我刚使用Swift实战开发并不久,过去三年多都都是搞Objective-C,所以对Swift和Objective-C优缺点还真没有多少简介,虽然网上也有不少相关的资料和回答,但是想想这个问题以后再很多打算或者还没有开始使用Swift的公司会被经常问到,所以就花了点时间整理一下……….

简介

Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言(已开源),可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。

动态性

Swift 是一种强类型语言。类型静态,也就是说 Swift 的默认类型是非常安全的。

  1. Swift 当中存在有这两个修饰符@objc@dynamic,此外我们同样还可以访问NSObject。
  2. @objc将您的 Swift API 暴露给 Objective-C 运行时,但是它仍然不能保证编译器会尝试对其进行优化。
  3. 如果您真的想使用动态功能的话,就需要使用@dynamic。一旦您使用了@dynamic修饰符之后,就不需要添加@objc了,因为它已经隐含在其中。

Swift比Objective-C有什么优势?

  1. Swift容易阅读,语法和文件结构简易化。
  2. Swift更易于维护,文件分离后结构更清晰。
  3. Swift更加安全,它是类型安全的语言。
  4. Swift代码更少,简洁的语法,可以省去大量冗余代码
  5. Swift速度更快,运算性能更高。

Swift目前存在的缺点

  1. 版本不稳定,之前升级Swift3大动刀,苦了好多人,swift4目前还未知
  2. 使用人数比例偏低,目前还是OC的天下
  3. 社区的开源项目偏少,毕竟OC独大好多年,很多优秀的类库都不支持Swift,不过这种状况正在改变,现在有好多优秀的Swift的开源类库了
  4. 公司使用的比例不高,很多公司以稳为主,还是在使用OC开发,很少一些在进行混合开发,更少一些是纯Swift开发。
  5. 偶尔开发中遇到的一些问题,很难查找到相关资料,这是一个弊端。
  6. 纯Swift的运行时和OC有本质区别,一些OC中运行时的强大功能,在纯Swift中变无效了。
  7. 对于不支持Swift的一些第三方类库,如果非得使用,只能混合编程,利用桥接文件实现。

整体总结

  • String:
    • Swift中String操作已经甩OC三百万条街
  • 泛型:
    • Swift泛用性还是不够强,如果项目不止涉及常用的http啊xmpp啊之类的协议,而是要做一些SIP啊FFMPEG啊之类的干活,那明显是OC成熟得多
  • Discriminated Union
    • swift里的enum. 是静态语言独有的特性.
  • 安全:
    • 由于swift的strong static type system,编译器可帮你检查出更多问题,而不是在运行时突然boom,还有一个很牛逼的安全特性就是OptionalType。
  • 快速:
    • 静态相对来说语言本身速度更快,swift编译期就能生成vtable,确定具体要调用的方法,比起oc的动态派发自然是更快,当然处理到与oc之间桥接部分,可能不一定比oc快

细节使用区别

  • 在 Swift 中没有了 main.m,@UIApplicationMain 是程序入口
  • swift不分.h和.m文件 ,一个类只有.swift一个文件,所以整体的文件数量比起OC有一定减少。
  • swift句尾不需要分号 ,除非你想在一行中写三行代码就加分号隔开。
  • 在 Swift 中,一个类就是用一对 { } 括起的,没有 @implementation 和 @end
  • swift数据类型都会自动判断 , 只区分变量var 和常量let
  • 强制类型转换格式不同 OC强转:(int)a Swift强转:Int(a)
  • 关于BOOL类型更加严格 ,Swift不再是OC的非0就是真,而是true才是真false才是假
  • swift的 循环语句中必须加{}就算只有一行代码也必须要加
  • swift的switch语句后面可以跟各种数据类型了 ,如Int、字符串都行,并且里面不用写break(OC好像不能字符串)
  • swift if后的括号可以省略: if a>b {},而OC里 if后面必须写括号。
  • swift打印 用print("") 打印变量时可以 print("\(value)"),不用像OC那样记很多%@,d%等。
  • Swift3的【Any】可以代表任何类型的值,无论是类、枚举、结构体还是任何其他Swift类型,这个对应OC中的【id】类型。
  • 在 OC 中 alloc / init 对应( )
  • 在 OC 中 alloc / initWithXXX 对应 (XXX: )
  • 在 OC 中的类函数调用,在 Swift 中,直接使用 .
  • 在 Swift 中,绝大多数可以省略 self.,建议一般不写,可以提高对语境的理解(闭包时会体会到)
  • 在 OC 中的 枚举类型使用 UIButtonTypeContactAdd,而 Swift 中分开了,操作热键:回车-> 向右 ->.
  • Swift 中,枚举类型的前缀可以省略,如:.ContactAdd,但是:很多时候没有智能提示
  • 监听方法,直接使用字符串引起

循环引用问题

Objective-C中循环引用也是遇到比较多的,一不小心就会导致循环引用,甚至导致内存问题

Swift

  • [weak self]
  • self是可选项,如果self已经被释放,则为nil

  • [unowned self]

  • self不是可选项,如果self已经被释放,则出现野指针访问

Objective-C

  • __weak typeof(self) weakSelf;
  • 如果self已经被释放,则为nil

  • __unsafe_unretained typeof(self) weakSelf;

  • 如果self已经被释放,则出现野指针访问

参考:

推荐几个Objective-C的框架

FBRetainCycleDetector

PLeakSniffer

MLeaksFinder

坚持原创技术分享,您的支持将鼓励我继续创作!