实例对象是咱们对类对象alloc或者new操做时所建立的,在这个过程当中会拷贝实例所属类的成员变量,但并不拷贝类定义的方法。缓存
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
复制代码
objc_object这个结构体只有一个isa变量,指向实例对象所属的类。任何带有以指针开始并指向类结构的结构均可以被视做objc_object, 对象最重要的特色是能够给其发送消息。bash
typedef struct objc_class *Class;
复制代码
因而可知 ,Class是指向C的结构体objc_class的指针,咱们再看一下objc_class的定义函数
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
复制代码
是一个Class 类型的指针,每一个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)spa
因而可知,在给实例对象或类对象发送消息时,寻找方法列表的规则为:指针
全部元类都有一个根元类,好比全部NSObject的子类的元类都会以NSObject的元类做为他们的类。全部的元类使用根元类做为他们的类,根元类的元类则就是它本身,也就是说根元类的isa指针指向他本身。code
object_getClass(实例对象) == [实例对象 class]
[类对象 class] == 类对象
object_getClass(类对象) == 类对象的isa == 元类
object_getClass(类对象) != [类对象 class]
复制代码