iOS Runtime详解(新手也看得懂)

2020-01-21 07:51:57刘景俊
  • Method(objc_method)
  • SEL(objc_selector)
  • IMP
  • 类缓存(objc_cache)
  • Category(objc_category)

    类对象(objc_class)

    Objective-C类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针。

    
    typedef struct objc_class *Class;

    查看objc/runtime.h中objc_class结构体的定义如下:

    
    struct objc_class {
     Class _Nonnull isa OBJC_ISA_AVAILABILITY;
    
    #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;

    struct objc_class结构体定义了很多变量,通过命名不难发现,
    结构体里保存了指向父类的指针、类的名字、版本、实例大小、实例变量列表、方法列表、缓存、遵守的协议列表等,
    一个类包含的信息也不就正是这些吗?没错,类对象就是一个结构体struct objc_class,这个结构体存放的数据称为元数据(metadata),

    该结构体的第一个成员变量也是isa指针,这就说明了Class本身其实也是一个对象,因此我们称之为类对象,类对象在编译期产生用于创建实例对象,是单例。

    实例(objc_object)

    
    /// Represents an instance of a class.
    struct objc_object {
     Class isa OBJC_ISA_AVAILABILITY;
    };
    
    /// A pointer to an instance of a class.
    typedef struct objc_object *id;