Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Swift是否和OC一样有runtime机制大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

Swift是否和OC一样有runtime机制 OC语言最大的特性无疑是其的动态性,可以利用OC的动态性能够获得一个类的方法和属性,从而实现灵活的程序,但Swift是否也包含了runtime机制呢? 参链接:http://mp.weixin.qq.com/s?__biz=MzA3ODg4MDk0Ng==&mid=403153173&idx=1&sn=c631f95b28a0eb4b842a9494
@H_674_10@

Swift是否和OC一样有runtime机制

OC语言最大的特性无疑是其的动态性,可以利用OC的动态性能够获得一个类的方法属性,从而实现灵活的程序,但Swift是否也包含了runtime机制呢?

链接:http://mp.weixin.qq.com/s?__biz=MzA3ODg4MDk0Ng==&mid=403153173&idx=1&sn=c631f95b28a0eb4b842a9494e43a30e5&scene=23&srcid=0331ZwO8t6uWiBON621r1GhC#rd

下面我们将从纯Swift的类和继承OC的Swift类来阐述Swift的runtime机制

分析用例:



方法,属性

动态性最重要的一点就是拿到某个类的方法属性,使用如下的方法打印类的方法属性


调用showClsRuntime打印方法


打印如下:


对于纯Swift的TestASwiftClass来说任何方法属性都未获取到。

对于TestSwiftClass来说除testReturnTuple、testReturnVoidWithaCharacter两个方法外,其他的都获取成功了。

这是为什么呢?

1:纯Swift类的函数调用已经不是OC那样的运行时消息了,而是类似C++似得vtable,在编译时就确定了调用那个函数了.

2:而TestSwiftClass继承自UIViewController也就是NSObject,Swift为了兼容OC,所以继承自NSObject的类都保留了他的动态性,所以我们能通过runtime拿到他的属性方法.

可是为什么testReturnTuple、testReturnVoidWithaCharacter这两个函数却无法通过runtime获得呢?

从OC的动态特性可知,所有运行时方法都依赖TypeEcoding,也就是@H_13_103@method_getTypeEncoding函数,它指定了参数类型以及参数在入栈时的内存空间,没有这个标识则没法入栈.而元祖,和字符类型是Swift独有的,所以不能利用runtime获得他的方法.

方法替代

动态性最常用的方法就是方法替代,将某个类的方法替代为自定义方法,从而起到hook的作用.

  • 对于纯Swift类(如TestASwiftClass)来说,无法通过objc runtime替换方法,因为由上面的测试可知拿不到这些方法属性

  • 对于继承自NSObject类(如TestSwiftVC)来说,无法通过runtime获取到的方法肯定没法替换了。那能通过runtime获取到的方法就都能被替换吗?我们测一把

    @H_841_94@method Swizzling的代码如下


@objc

找到官方文档读读。

可以知道@objc是用来将Swift的API导出给Objective-C和Objective-C runtime使用的,如果你的类继承自Objective-c的类(如NSObject)将会自动被编译器插入@objc标识。

我们在把TestASwiftClass(纯Swift类)的方法属性前都加个@objc 试试,如图:

dynamic

文档里还有一句说明:
加了@objc标识的方法属性无法保证都会被运行时调用因为Swift会做静态优化。要想完全被动态调用,必须使用dynamic修饰。使用dynamic修饰将会隐式的加上@objc标识。
这也就解释了为什么testReturnVoidWithaId无法被替换,因为写在Swift里的代码直接被编译优化成静态调用了。

而viewDidAppear是继承Objective-C类获得的方法,本身就被修饰为dynamic,所以能被动态替换。

大佬总结

以上是大佬教程为你收集整理的Swift是否和OC一样有runtime机制全部内容,希望文章能够帮你解决Swift是否和OC一样有runtime机制所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。