美文网首页
理解Objc Runtime

理解Objc Runtime

作者: link_hui | 来源:发表于2018-05-26 22:47 被阅读4次

Objective-C是一个动态语言,有一个c和汇编语言编写的runtime库(lib.objc.A.dylib)来实现。Apple的Runtime编程指南。也可以参考这里的源码

类的定义

runtime.h中定义了objc_class的结构

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;//isa指针指向Meta Class,因为Objc的类的本身也是一个Object,为了处理这个关系,runtime就创造了Meta Class,当给类发送[NSObject alloc]这样消息时,实际上是把这个消息发给了Class Object


#if !__OBJC2__
    Class _Nullable super_class                         OBJC2_UNAVAILABLE;//父类     
    const char * _Nonnull name                         OBJC2_UNAVAILABLE;  //类名   
    long version                                     OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                     OBJC2_UNAVAILABLE;//实例变量大小  
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;//成员变量列表
    struct objc_method_list * _Nullable * _Nullable methodLists  //方法定义的列表                  OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE; //方法缓存
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE; //协议列表
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

实例的定义

objc.h中实例和id的定义

/// Represents an instance of a class.
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;

可以看到实例只有一个isa指针,指向这个实例的类对象。当向某个实例发消息的时候,通过isa找到类以及父类的方法列表。id就是一个实例的指针,可以被转换为任意对象。

Meta Class

前面讲Class的isa指向这个类对象的类。我们知道Objc支持类方法,当想类发消息调用类方法的时候,就通过isa找到Meta Class的方法列表。

相关文章

网友评论

      本文标题:理解Objc Runtime

      本文链接:https://www.haomeiwen.com/subject/lcjvjftx.html