什么是Runtime?
Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。
多数情况我们只需要编写 OC 代码即可,Runtime 系统自动在幕后搞定一切,所以很多朋友对runtime不是很重视,等面试的时候经常被面试官卡住.我也是新手,吃了这个亏,所以对runtime进行了学习,以通俗易懂的方式分享给大家
Runtime 的作用
可以通过Runtime修改系统方法,比方说我们平时在项目中用到WKWebView(UIWebView)去加载一些url,如果在URL中含有中文,OC语言是不能够识别出该URL的.所以我们输出的URL为null,此时界面就加载不出来,那么我们如何去避免这种问题?
第一种方式,使用Category(类的扩展)首先我们创建一个继承与NSURL的扩展
然后我们在这个扩展的.h中写一个类方法
然后在.m中去实现
最后回到自己的控制器去导入这个扩展到头文件,将本来系统的URLWithString 改成自己扩展的类方法,这样我们就能轻易的定位到为什么自己的URL没有加载出来了
那么重点来了,我们如何使用Runtime去实现修改系统提供给我们的方法呢?(不用自定义方法)
首先大家要知道,执行URLWithString方法的时候,系统内部会首先调用+(void)load方法,那我们就在这个方法里边使用Runtime进行修改,先导入头文件#import <objc/runtime.h>然后在load方法中将系统的URLWithString方法和我们之前自定义的BX_UrlWithString方法进行交换.也就是说,当我们调用URLWithString方法加载url的时候,让系统内部自动调用我们自定义的BX_UrlWithString方法中来.下图都有注释,此时我们在我们控制器中用URLWithString去加载URL就会实现了在他的内部多一个我们自己加的功能(判断URL是否为nil)
到这里我们就实现了使用Runtime实现系统内部方法的修改. 新手分享,大神不喜勿喷.