Objective-C Runtime(2)

本文深入探讨Objective-C Runtime中的结构体和消息机制。介绍如何通过C语言结构体影响OC类,以及Objective-C的消息发送如何在运行时通过objc_msgSend方法完成动态绑定。文章详细阐述了方法查找的过程,包括缓存、objc_method列表和父类结构体的搜索,并指出Runtime允许修改方法实现以实现绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值