swift中的@objc的做用

转载:https://www.jianshu.com/p/6c5b45d9d042

自动清除冗余代码减少包大小

得益于 Swift 的静态语言特性,每一个函数的调用在编译期间就能够肯定。所以在编译完成后能够检测出没有被调用到的 swift 函数,优化删除后能够减少最后二进制文件的大小。这个功能在 XCode 9 和 Swift 4 中终于被引进。相较于 OC 又多了一个杀手级特性。swift

那么为何 OC 作不到这点呢?由于在 OC 中调用函数是在运行时经过发送消息调用的。因此在编译期并不肯定这个函数是否被调用到。由于这点在混合项目中引起了另一个问题:swift 函数怎么知道是否被 OC 调用了呢?出于安全起见,只能保留全部可能会被 OC 调用的 swift 函数(标记为 @objc 的)。安全

在 swift 3 中除了手动添加 @objc 声明函数支持 OC 调用还有另一种方式:继承 NSObject。class 继承了 NSObject 后,编译器就会默认给这个类中的全部函数都标记为 @objc ,支持 OC 调用。然而在实际项目中,一个 swift 类虽然继承了 NSObject,可是其中仍是有不少函数不会在 OC 中被调用,这里有很大的优化空间。因而根据 SE160 的建议,苹果修改了自动添加 @objc 的逻辑:一个继承 NSObject 的 swift 类再也不默认给全部函数添加 @objc。只在实现 OC 接口和重写 OC 方法时才自动给函数添加 @objc 标识。函数

XCode 9会在运行过程当中自行检测类中函数是被 OC 调用,而后提示添加 @objc。下图中的 vc 是 swift 中的类,showStatus 也是 swift 函数,如今编译器会提示须要手动添加 @objc:优化


 
 

也会在控制台中输出警告:spa


 
 

若是你的项目中并不须要优化包大小或者大部分的 swift 函数都会被 OC 调用到,也能够在 XCode 中改回原来 Swift 3 的逻辑:orm


 
 

这个优化帮助苹果的 Apple Music 应用减少了5.7%的包大小。blog

相关文章
相关标签/搜索