Objective-C Runtime

介绍

runtime到底是什么?

也有人说“Objective-C是最优美的语言”,那么到底是为什么?

runtime和Objective-C的关系是什么样的?

runtime有什么作用,具体能干什么?

runtime的原理是什么,什么是消息机制?

runtime的使用需要注意什么?

一下我们将围绕这几个问题展开来做介绍。

runtime是什么

在上一篇博客中说道runtime 是运行时库,其实这样去介绍是不全面的,runtime可以理解为运行时编程,也就是说我们在程序运行也就是编译完成时,还可以对程序进行修改。就说强大不强大吧!

我们都知道Objective-C时基于C语言使用面向对象的思想进行封装,也就是说把面向过程的C语言封装成了面向对象语言。我们要研究运行时,那么我们从成地方开始呢? 运行时特性是怎么来的呢?

我们来想任何一门语言开发出来的程序,要被执行都要被编译成机器识别的语言,也就是由0和1组成的汇编语言。那么Objective-C程序在编译过程中经历了什么?

Objective-C基于C语言,在编译过程中首先会编译为C语言,然后在编译为可执行文件。没错,我们在OC中所有的类、方法、属性都会编译为C语言的结构体,而runtime在C语言中可以动态改变这些结构体,也就改变了OC中的类、方法和属性。

Objective-C中的类

我们都知道我们类Class,我们使用Commend + 点击 进去查看

typedef struct objc_class *Class;

使用 typedef 给结构体 objc_class 起了别名为Class,同样id也是这样。我们继续看objc_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;

这个时候我们可以清晰看到,我们实例化一个类其实就是说我们最终得到的是一个objc_class的结构体指针。同样id类似于Class也是一个重定义objc_object的结构体。

typedef struct objc_object *id;

truct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

那么我们就要思考了,我们在OC中的属性和方法,是以什么样的形式存在的呢,我们现在知道我们实例化的类最后都是objc_class的结构体指针,我们来分析一下这个结构体(objc_class)

  • Class isa OBJC_ISA_AVAILABILITY;

    • 指向元类(metaclass)的指针。元类保存了类方法的列表
  • Class super_class

    • 这看字面意思就知道,指向父类的指针
  • const char *name

    • name类的名称
  • long version

    • 版本,具体有什么用呢?
  • long info

    • 信息,类的基本介绍
  • long instance_size

    • 实例变量大小
  • struct objc_ivar_list *ivars

    • 成员变量列表
  • struct objc_method_list **methodLists

    • 方法列表
  • struct objc_cache *cache

    • cache缓存,缓存最近使用的方法指针便于查找
  • struct objc_protocol_list *protocols

    • 协议列表

通过以上的介绍是不是一个objc_class这样的就够提就包含了我们类的全部内容了,其中的isa指针我们在后面详细的介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值