runtime介绍以及在项目中的实际运用

本文介绍了Objective-C的Runtime机制,特别是消息传递的概念,以及如何利用Runtime解决实际项目中的问题,包括避免NSNull崩溃、数组越界、字典转模型和KVO的实现。通过对Runtime的理解和应用,可以提高代码的健壮性和灵活性。
摘要由CSDN通过智能技术生成

Objective-C 是一门动态语言,相比C语言来说,增加了面向对象的特性和消息传递机制。消息传递机制的基础就是runtime,也就是常说的运行时机制。

网上关于runtime的介绍已经非常多了,因此本文对runtime不对做过多的介绍,而是结合我个人在项目中遇到的实际问题,介绍一些runtime在项目中的实际应用。

runtime介绍

在开始说runtime在项目中的实际运用之前,还是先简单介绍下runtime。

runtime的核心是消息传递。对比Objective-C和C/C++, 调用一个方法/函数在Objective-C中被称之为发送消息。如 [A testMethod],可以翻译成向A对象发送了 testMethod的消息。为何在Objective-C中,函数调用被称之为发消息?以及Objective-C中的发消息和C/C++ 中的函数调用有什么区别?

我们知道,C语言是 “静态语言”, 所谓静态语言,指的是一个方法/函数和内存中的一段代码绑定在一起,程序执行时,调用一个方法,实际上就是直接执行对应内存中的代码段。而且,函数名和代码段绑定这个过程在编译阶段就已经确定好了。而在Objective-C中,[object testMethod] 不会立即执行 testMethod方法,而是会向 object 发送一个 testMethod的消息,最终消息的接收的者,可能是 object对象,也可能不是object对象,这个过程是在运行时发生的。也就是说,在编译阶段,[object testMethod] 程序是不知道 testMethod 消息的最终接收者是谁的,消息的接收者,在运行时才能够确定。

消息传递

上面也提到了,[object testMethod] 会向object发送一个testMethod的消息,但是消息最终的接收者不一定是object对象,寻找消息最终接收者的过程实际上就是一个消息传递的过程。首先看一下Objective-C中object 和 class 的定义。

在objc.h中可以看到object的定义,如下:

struct objc_object {
   
    Class isa  OBJC_ISA_AVAILABILITY;
};

在runtime.h中可以看到Class的定义,如下:

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

消息传递的关键是isa指针以及方法列表,也就是objc_method_list。消息传递的过程大致如下:
1. 首先根据object对象的isa指针获取到该对象所属的类,然后在类对象的方法列表中寻找,是否有对应的方法。如果有,则找到,object即为消息最终的接收者;如果没找到,进行第2步。
2. 第上一步获取到的类对象,根据super_class指针,可以获取到该类的父类,在父类的方法列表中寻找是否有对应的方法。如果有,则找到返回;如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值