一、对象 id
1,id是指向objc_object结构体的指针变量,objc_object结构体中首个成员是Class类的变量:Class isa;该变量定义了对象所属的类。而Class所指向的objc_class结构体中的首个成员也是isa变量,还包括其他成员,则Class本身可以说是继承自objc_object,所以id可以指向所有OC的对象。
二、类对象
1,由于Class本身也是OC的对象,则称之为类对象,类对象的结构体中包含了本类的一些成员,包括元类的指针,父类的指针,类名,所占内存空间,版本,信息,实例变量表,实例方法表的指针,方法缓存,协议表。实例对象可以通过isa指针找到本类的实例变量以及实例方法和协议进行调用。
三、元类
1,类对象中的isa指向他的元类,类对象可以说是元类的实例,在内存中元类只会生成一个类对象的实例,而元类中的结构与类对象的结构是一样的,不过元类的isa指向根元类(NSObject的元类),元类的super_class指向根类对象(NSObject),根元类的isa指向它自己。元类中保存着static声明的静态变量与类方法。
四、消息传递与消息转发
1,对象调用方法,在OC中会转换成objc_msgSend(id,SEL,...)函数调用,通过对象的isa指针找到所属的类对象,通过SEL在类对象的实例方法列表中找到对应的方法,如果找不到,通过类对象的super_class指针找到父类,在父类方法表中继续查找,一层一层向上传递,直到根类。根据方法返回值的不同还会转换成不同的函数调用:objc_msgSend_stret()反回结构体,objc_msgSend_fpret()返回浮点数,objc_msgSendSuper()给父类发消息,父类也有以上两种。
2,消息转发,如果一个对象没有实现某个方法,在调用此方法时会进入消息转发流程,如果实现了消息转发接口,则可以在消息转发中控制方法的传递,改变接受消息的对象或实现方法。直接上图