美文网首页
NSObject,Class ,objc_class

NSObject,Class ,objc_class

作者: linbj | 来源:发表于2017-12-14 11:39 被阅读40次
    image.png

    Objective-C 中 NSObject是大多数类的根类。

    NSObject定义
    
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0)
    OBJC_ROOT_CLASS
    OBJC_EXPORT
    @interface NSObject <NSObject> {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wobjc-interface-ivars"
        Class isa  OBJC_ISA_AVAILABILITY;
    #pragma clang diagnostic pop
    }
    

    NSObject 里面有一个class类的 isa 属性。

    在objc/objc.h 文件中可以看到Class 其实就是一个objc_class。
    
    typedef struct objc_class *Class;
    
    在objc/runtime.h文件中找到了具体的定义,它是一个结构体。
    
    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;
    /* Use `Class` instead of `struct objc_class *` */
    
    isa:
    是一个 Objective-C Class 类型的指针. 实例对象有个isa的属性,指向Class, 而Class里也有个isa的属性, 指向meteClass. 这里就有个点, 在Objective-C中任何的类定义都是对象.
    
    super_class
    指向该类的父类, 如果该类已经是最顶层的根类(如 NSObject 或 NSProxy),那么 super_class 就为 NULL.
    
    
    version
    
    类的版本信息,默认为0
    info
    
    供运行期使用的一些位标识。
    instance_size
    
    该类的实例变量大小
    
    
    成员变量的数组
    struct objc_ivar_list {  
        int ivar_count;  
        /* variable length structure */  
        struct objc_ivar ivar_list[1];  
    }  
    
    
    方法定义的数组
    struct objc_method_list {  
        struct objc_method_list *obsolete;  
        int method_count;  
        /* variable length structure */  
        struct objc_method method_list[1];  
    }  
    objc_cache
    
    指向最近使用的方法.用于方法调用的优化.
    struct objc_cache {  
        unsigned int mask /* total = mask + 1 */;  
        unsigned int occupied;  
        Method buckets[1];  
    };  
    protocols
    
    协议的数组
    [objc] view plain copy
    struct objc_protocol_list {  
        struct objc_protocol_list *next;  
        long count;  
        Protocol *list[1];  
    };  
    

    相关文章

      网友评论

          本文标题:NSObject,Class ,objc_class

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