NSObject的结构

ios中NSObject的定义

查看苹果源码可看到,苹果源码地址Source Browser

struct objc_object {

    Class_Nonnull isa  OBJC_ISA_AVAILABILITY;

};

其中Class为一个结构体指针typedef struct objc_class *Class;。

objc_class结构体定义为

structobjc_class {

    Class_Nonnullisa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__

    Class _Nullable super_class                              OBJC2_UNAVAILABLE;

    const char*_Nonnullname                              OBJC2_UNAVAILABLE;

    long version                                            OBJC2_UNAVAILABLE;

    long info                                                OBJC2_UNAVAILABLE;

    long instance_size                                      OBJC2_UNAVAILABLE;

    struct objc_ivar_list *_Nullableivars                  OBJC2_UNAVAILABLE;

    struct objc_method_list *_Nullable*_NullablemethodLists                    OBJC2_UNAVAILABLE;

    struct objc_cache *_Nonnullcache                      OBJC2_UNAVAILABLE;

    struct objc_protocol_list *_Nullableprotocols          OBJC2_UNAVAILABLE;

#endif

} OBJC2_UNAVAILABLE;

元类(Meta Class)的定义

isa表示一个Class对象的Class,也就是Meta Class

Category实现原理

查看分类结构体

structobjc_category {

char*category_name;

char*class_name;

struct objc_method_list *instance_methods;

struct objc_method_list *class_methods;

struct objc_protocol_list *protocols;

};

查看objc_method_list结构体

structobjc_method_list {

#if defined(Release3CompatibilityBuild)

        structobjc_method_list *method_next;

#else

structobjc_method_list *obsolete;

#endif

intmethod_count;

#ifdef __alpha__

intspace;

#endif

structobjc_method {

SELmethod_name;

char*method_types;

                IMPmethod_imp;

} method_list[1]; /* variable length structure */

};

查看objc_protocol_list结构体

structobjc_protocol_list {

structobjc_protocol_list *next;

intcount;

Protocol *list[1];

};

查看objc_ivar_list的定义

struct objc_ivar_list {

  int ivar_count                                          OBJC2_UNAVAILABLE;

#ifdef __LP64__

  int space                                                OBJC2_UNAVAILABLE;

#endif

  /* variable length structure */

  struct objc_ivar ivar_list[1]                            OBJC2_UNAVAILABLE;

}

methodLists表示方法列表,它指向objc_method_list结构体的二级指针,可以动态修改*methodLists的值来添加成员方法,也可以动态修改objc_protocol_list来添加protocol,也是Category实现原理,同样也解释Category不能添加属性的原因。在runtime.h可以看到它的定义:

你可能感兴趣的:(NSObject的结构)