先查看一段OC源码,关于类的定义:
/// An opaque type that represents an Objective-C class. typedef struct objc_class *Class;
类的定义:
struct objc_class { Class isa OBJC_ISA_AVAILABILITY; #if !__OBJC2__ Class super_class OBJC2_UNAVAILABLE; const char *name OBJC2_UNAVAILABLE; long version OBJC2_UNAVAILABLE; long info OBJC2_UNAVAILABLE; long instance_size OBJC2_UNAVAILABLE; struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; struct objc_method_list **methodLists OBJC2_UNAVAILABLE; struct objc_cache *cache OBJC2_UNAVAILABLE; struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; #endif } OBJC2_UNAVAILABLE;
对象的定义:
/// Represents an instance of a class. struct objc_object { Class isa OBJC_ISA_AVAILABILITY; };
泛型的定义:
/// A pointer to an instance of a class. typedef struct objc_object *id;
1、在Objective-C中,任何类,它自身也是对象。
2、Objective-C类是由Class
类型来表示的,它实际上是一个指向objc_class
结构体的指针;
3、对象的结构体中,只有一个指向其类的isa指针;
4、isa:是一个Class类型的指针;
每个实例对象也有个isa指针,指向自身类;
每个类也有个isa指针,指向meta-class(元类);
meta-class的isa指向其基类的meta-class,以此作为它们的所属类。
任何NSObject继承体系下的meta-class都使用NSObject的meta-class作为自己的所属类,而基类的meta-class的isa指针是指向它自己。这样就形成了一个完美的闭环。
isa作用:当一个对象收到一条消息时,runtime会根据isa指针找到能够响应这个消息的对象,然后在该对象所属类的方法列表中查找消息对应的selector指向的方法,若没有找到对应的方法,meta-class会向父类查找方法。找到后即运行这个方法。
5、super_class:指向该类父类的Class类型指针。如果该类已经是最顶层的父类,则super_class为NULL;
6、ivars:成员变量的数组
7、cache:用于缓存最近调用的方法。提高调用效率。
8、version:类的版本信息,默认为0。