Runtime常用方法个(更新中)未完待续。。。

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.不需要引入某个类的头文件,直接初始化该类对象

你可能感兴趣的:(Runtime常用方法个(更新中)未完待续。。。)