先放一张图,说明下Object-C的对象,类和Meta-Class的关系

每一个对象本质上都是一个类的实例。其中类定义了成员变量和成员方法的列表。对象通过对象的isa指针指向类。
每一个类本质上都是一个对象,类其实是元类(meteClass)的实例。元类定义了类方法的列表。类通过类的isa指针指向元类。
所有的元类最终继承一个根元类,根元类isa指针指向本身,形成一个封闭的循环。
表现形式就是:
1. 调用对象实例方法,就在该对象对应的类的方法列表中查找方法名。
所有,如果有人问你,一个类中可不可以声明两个方法 +(void)testa; - (void)testa; 答案就是可以的,因为方法的调用顺序说明了他们不存在一个地方。
找到 objc.h中定义id 和 objc_object如下:
1 2 3 4 5
| typedef struct objc_object *id;
struct objc_object { Class _Nonnull isa OBJC_ISA_AVAILABILITY; };
|
id是一个objc_object结构类型的指针。
对于objc_class的定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| typedef struct objc_class *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
} OBJC2_UNAVAILABLE; /* Use `Class` instead of `struct objc_class *` */
|
Class是一个objc_class结构类型的指针