美文网首页
NSObject的结构

NSObject的结构

作者: AmyQin | 来源:发表于2018-03-21 11:56 被阅读0次

    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的结构

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