runtime是个很屌的东西,但是也并不是很高深的东西,iOS学到一定程度不可避免的就要搞它了,经过最近几个月频繁的学习和去了解,逐渐解开了runtime的神秘面纱,让我们一探究竟吧。
runtime叫做运行时,好多语言都有运行时,我也不知道除了OC还有啥,哈哈哈,顾名思义,运行的时候,其实也就是程序运行的时候所发生的一些事,OC的运行时主要是消息转发机制。
OC这个语言我们平时都写.h和.m,一个是interface一个是implement,我们都在.h定义接口啊,声明属性,定义方法啥的,然后.m里面写上具体的实现细节,我的理解,首先,我们写的OC,到运行时都变成C语言,然后调用方法都是发消息,大概是有个方法列表,列表里对应有一个方法实现的指针IMP,然后,调用方法就是objc_msgsend,也就是OC中所有方法都是发消息实现的
1.发送消息
// 创建person对象
Person*p = [[Person alloc] init];
// 调用对象方法
[p eat];
// 本质:让对象发送消息
objc_msgSend(p,@selector(eat));
// 调用类方法的方式:两种
// 第一种通过类名调用
[Person eat];
// 第二种通过类对象调用
[[Person class]eat];
// 用类名调用类方法,底层会自动把类名转换成类对象调用
// 本质:让类对象发送消息
objc_msgSend([Person class],@selector(eat));
原理:方法在runtime里面调用的是
比如:
objc_msgSend([Person class],@selector(eat));
实际上:
objc_msgSend(XXXXXX,@selector(YYYYYY));
XXXX就是就收消息的对象,YYYYY就是就收消息后执行的方法,所以比如这里的@selector()实际上是一个SEL,这个东西好像是对应一个数也不一个字符串的,然后根据这个东西,runtime运行时的时候,找这个方法,然后每个方法对应他的执行代码的一个IMP指针,然后再执行。
2.交换方法
这个方法的实现主要就是取到方法对应的IMP实现通过method_exchangeImplementations
交换实现,进而实现方法的交换。
3.添加方法
4.不需要引入某个类的头文件,直接初始化该类对象