Objective-C Runtime(2)

来源:互联网 发布:曙光服务器安装linux 编辑:程序博客网 时间:2024/05/11 18:25

上一篇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”库。

0 0