上一篇Runtime中介绍了类最终都是以C语言结构体的形式展现,那么C语言中结构体是什么样的有哪些特新和作用呢?
结构体
在C语言中结构体是一种集合,比如包含基础数据类型的int,char ,double等等,可以包含我们想要的数据。结构体也是一种数据类型,我们一颗创建一个结构体,并对其进行修改。结构体本身不占用内存空间,结构体变量占用一块连续的内存空间。
上一篇中我们提到OC的类最终是C语言的结构,而C语言中结构体可以修改。那么我们是不是可以通过修改C语言的结构体,来影响OC中的类呢。
当然Objective-C是允许我们使用C语言来进行开发的。我们已经知道了类的表现,那么类的调用又是什么样的的,这里我们引入消息机制。
消息机制
消息机制,就是在使用某一类的方法的时候我们通过发送消息的形式,而不是通过调用,调用是编译的时候已经确定了你要执行的动作,也是调用确定的方法。确实有点绕,我们明白消息就可以了。
比如我们执行一个Person的方法:
- (void)actionMethod{
NSLog(@"%s", "run");
}
Person *teach = [[Person alloc] init];
//执行actionMethod方法
[teach actionMethod];
Person实例teach 执行actionMethod方法的绑定是通过运行时,那么编译的时候会变成什么,我们来看
编译器会将消息的发送转化成objc_msgSend方法,可以在”objc/message.h”头文件中查看
/*
* receiver 消息的发送者
* selector 执行的方法
* arg1 参数1
* arg2 参数2
* ……
*/
objc_msgSend(receiver, selector, arg1, arg2, …);
[teach actionMethod]在编译的时候:
objc_msgSend(teach, sel_registerName("actionMethod"));
那么objc_msgSend这个方法在什么时候完成动态绑定呢?
1.首先通过receiver(teach类)查找selector(actionMethod)的实现
2.调用该实现,并将一系列参数传递过去(actionMethod没有参数就不传)
3.将该实现的返回值作为自己的返回值,返回(actionMethod没有返回值)
下面我们开看看方法查找的过程,结合之前介绍的结构体
1.通过对象的isa指针找到对应类
2.在objc_cache缓存中去找对应的selector,找到就完成绑定
3.没有找到,在objc_method列表中找,找到就先加入缓存,完成绑定
4.还没有找到,就在super_class的指针指向父类的结构体中查找,直到找到
我们直到完成方法绑定实在运行的时候,那么我们就可以通过Runtime修改方法的实现然后完成绑定。
PS
下一篇中介”objc/runtime.h”库。