iOS~runtime理解上篇

什么是Runtime?

Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。

多数情况我们只需要编写 OC 代码即可,Runtime 系统自动在幕后搞定一切,所以很多朋友对runtime不是很重视,等面试的时候经常被面试官卡住.我也是新手,吃了这个亏,所以对runtime进行了学习,以通俗易懂的方式分享给大家

面试题:  runtime是什么?或者是同类的

答: 其实runtime就是运行时机制,可以通过命令行clang -rewrite-objc 对应的目标文件,就能将对应的OC的代码转成对应的运行时的代码

或者说,我现在有一个项目,已经开发了两年,之前都是用WKWebView去加载URL,但是组长现在想判断URL是否为空,给我提示是否加载成功.那么项目中那么多的web页,一个一个去改,太麻烦.就可以用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还有动态添加方法(也可以说是方法的懒加载)

面试官问: 有没有使用过performSelector----->其实这里面试官想问的是你有没有动态的添加过方法

这里就应该这样答: 使用过--->什么时候使用----动态添加方法的时候使用------>为什么动态添加方法---又回到到上面说的什么时候动态添加方法.

简述下Objective-C中调用方法的过程

Objective-C是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下:

    • objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类

    • 然后在该类中的方法列表以及其父类方法列表中寻找方法运行

    • 如果,在最顶层的父类(一般也就NSObject)中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX

 

到这里我们就实现了使用Runtime实现系统内部方法的修改. 新手分享,大神不喜勿喷.

  

原文地址:https://www.cnblogs.com/baxiu/p/7787076.html