NSObject,Class ,objc_class

2017-12-14  本文已影响40人  linbj
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];  
};  
上一篇下一篇

猜你喜欢

热点阅读