iOS Runtime 详细解析

1 篇文章 0 订阅

1.定义

首先,需要知道什么是runtime,runtime是基于C语言的一套API,C语言是基于面向过程的,而runtime在C的基础上进行了一次封装,使得C语言有了面向对象这一说。

2.工作原理

当我们向一个Objective-C对象发送消息时,runtime会根据实例对象的isa指针找到这个实例对象所属的类。那么runtime就会在这个类的方法列表里面以及父类的方法列表里面去寻找与之相关的一些方法,找到后,运行即可。

在objective-c中,消息直到运行时才绑定到方法实现上。编译器会将消息表达式[reveiver message]转化为一个消息函数的调用,即obj_msgSend,这个函数讲消息接收者和方法名作为其基础参数:obj_msgSend(receiver,selector),具体解释:通过接受者(receiver的isa指针)可判断是哪个具体的类(类的结构体),然后通过SEL在方法分发表里找到对应的IMP,通过IMP找到函数的地址即具体selector方法,即可运行。那么在查找的过程中,如果当前类没有selector,那么isa会指向起父类的结构体,以此类推。如果实在找不到,那么会走消息转发机制,下面,来了解下什么是消息转发机制。

3.消息转发机制

当一个对象无法接收到某一个消息时,会调用消息转发机制,通过这机制,可以在控制台告诉开发者具体报错信息。

消息转发机制分为:动态方法解析、备用接受者、完整转发。

在大概了解了runtime后,咱们具体来看下代码是如何实现的。

查看<objc/objc.h>

1.OC中的对象是一个objc_object类型的结构体

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

id是一个objc_object类型的指针

typedef struct objc_object *id;

2.OC中的类是一个objc_class类型的结构体

struct objc_class{

    Class isa OBJC_ISA_AVAILABILITY;

    #if !__ OBJC2__

    Class super_class

    const char *name

    long version

    long info

    long instance_size

    struct objc_ivar_list

    struct objc_method_list *methodLists

    struct objc_cache *cache

    struct objc_protocol_list *protocols

    #endif

    }OBJC2_UNAVAILABLE

3.isa是一个指向objc_class结构体的指针 
(1)对于objc_object,其isa指向的是对象对应的类 
(2)对于objc_class,其isa指向的是类对应的类-元类(metaclass)

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值