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

每一个对象本质上都是一个类的实例。其中类定义了成员变量和成员方法的列表。对象通过对象的isa指针指向类。

每一个类本质上都是一个对象,类其实是元类(meteClass)的实例。元类定义了类方法的列表。类通过类的isa指针指向元类。

所有的元类最终继承一个根元类,根元类isa指针指向本身,形成一个封闭的循环。

表现形式就是:

1. 调用对象实例方法,就在该对象对应的类的方法列表中查找方法名。

2. 调用类的实例方法,就在该类对象的Meta Class中查找那个消息。

所有,如果有人问你,一个类中可不可以声明两个方法 +(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结构类型的指针