征服SwiftiOS知识收集学习中的Swift

Swift Runtime

2016-03-31  本文已影响6260人  Stark_Dylan

深入了解过Objective-C这门语言的人一定知道,这是一门动态语言。在日常的开发中,也常常会使用到Runtime对自己的项目做一些小"手脚",比如说替换这些视图控制器的viewWillAppear方法让他们在启动的时候能在自己的事件日志中记录一下,或者是记录一下这个视图控制器的时间;或者是对某个模型做一些便利化的操作,比如说动态的获取到模型里边的属性名称,然后自动的encodedecode,将JSON自动的转为Model之类的操作。

Swift问世到现在已经有段时间了,从最开始的不稳定、BUG、各种各样的调整到现在稳定的版本Swift2.2,有一部分"喜新厌旧"的人已经正式的投入到了Swift开发之中,我认识的朋友也有几个把他们用到了真正的项目开发中,每次总是向我们这些OC的开发者在抱怨,这玩意编译好慢、这Swift好像有很多种写法啊,更像是面向接口开发,确实,当你看到一些BindRAC等库的时候,眼花缭乱的,可能需要细细的看才能知道这个方法的来龙去脉,而我感觉OCSwift两种语言对于开发者来说,若是想做一个不错的iOS开发者,OC一定是不能丢弃的,毕竟这门老语言已经成熟了很久,枝叶茂密,Swift任然是襁褓中的婴儿,有待培养、研究。

进入正题,为了便于大家的理解,我们这里的实验类有2个,一个是纯Swift类,另外一个继承于NSObject

测试类 获取相关信息

Swift的基本语法知识这里就不说了-。-

然后调用看一下打印的结果

调用代码 TestSwiftClass结果 ViewController结果

这是为什么?

m_type: Optional("q24@0:8q16") 

上边代码的解释在这里:
代码解释

Type Encoding扩展阅读1
Type Encoding扩展阅读2
Type Encoding官网文档

OC项目中,想必大部分人都使用了这个Method Swizzling,替换一些系统类的方法为自己的方法,以提供便捷(Hook)。

替换方法 调用

确认可以交换。最后打印 des。 但是奇怪的事情出现了,这个时候我也想替换一下returnInt这个方法,但是却发现不可以了。所以我们加断点看一下调试信息。我们可以看到,在my_ViewDidAppear前,有@objc这样一个小玩意在,而大家单独调试returnInt却没有。

@objc

@objc是用来将Swift的API导出给OC与OC runtime使用的,如果你继承NSObject的类,将会被自动的加入这个标识。

这样一来,真相大白,我们给之前的纯Swift类加上这个标识看一下效果。

代码

这样,属性与方法名全部打印了出来。

dynamic

同时,还有这个,文档中有一句说明,加了@objc标识的方法、属性都无法保证都会被运行时调用,因为Swift会做静态优化。要想完全被动态调用就要使用dynamic修饰词了。使用这个标识也会隐形的加入@objc。这也就解释了为什么上边VC中的方法无法被替换了,被Swift优化成静态调用了,而ViewDidAppear本身为OC的方法,拥有动态特性,所以我们加入dynamic关键字

答案

这样,结果打印2喽,成功的动态替换。

今天文章就写到这里啦。

手机淘宝技术团队MTT今天发布了这篇Swift Runtime分析: 还像OC Runtime一样么文章,细读之后给更多的人分享出来。也希望读者在看到这篇文章的时候打开Xcode,新建一个工程来实际测试一下。

CopyRight@Dylan 2015-3-31 愚人节快乐。

上一篇下一篇

猜你喜欢

热点阅读