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];
};