Objective-C是一个动态语言,有一个c和汇编语言编写的runtime库(lib.objc.A.dylib)来实现。Apple的Runtime编程指南。也可以参考这里的源码。
类的定义
runtime.h中定义了objc_class的结构
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;//isa指针指向Meta Class,因为Objc的类的本身也是一个Object,为了处理这个关系,runtime就创造了Meta Class,当给类发送[NSObject alloc]这样消息时,实际上是把这个消息发给了Class Object
#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 *` */
实例的定义
objc.h中实例和id的定义
/// 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;
可以看到实例只有一个isa指针,指向这个实例的类对象。当向某个实例发消息的时候,通过isa找到类以及父类的方法列表。id就是一个实例的指针,可以被转换为任意对象。
Meta Class
前面讲Class的isa指向这个类对象的类。我们知道Objc支持类方法,当想类发消息调用类方法的时候,就通过isa找到Meta Class的方法列表。