借鉴下面作者的文章:iOS-对象、isa和SuperClass
问题一:基类的meta-class的superclass指向基类的class有什么用,类对象可以调用同名的基类实例方法。
类对象可以调用实例方法,准确的说是可以调用基类类对象的,即NSObject的类对象中存储的实例方法。
实例对象不可以调用类方法。
原因:
第一:调用方法实质是runtime的消息转发机制,runtime只会根据方法名寻找而不会在意是类方法还是实例方法。
第二就是OC内部查找方法的顺序方式决定,OC主要有三个对象,实例对象,类对象,元类对象,其中三者都包括isa指针,其中类对象和元类对象还包括Superclass。
Isa指针使三者建立联系,实例对象指向类对象,类对象指向元类对象,而Superclass指针建立继承关系。
实例对象调用实例方法,因为实例方法存在类对象中,方法的查找只会在本类的类对象及其父类类对象中查找,如果基类类对象也查找不到就报找不到方法的错误,类方法存储在元类对象中,所以实例对象和元类方法没有交集,不可能调用类方法。
类对象调用类方法,在元类对象及其元类对象父类中查找,唯一的不同是,基类的元类对象的Superclass指向基类类对象,然后基类类对象中不存在才会报找不到方法的错误。因为这一点不同,当类对象调用类方法,在元类对象中查找不到对应的类方法时,会从类对象中查找名字相同的实例方法调用。
1、你了解到isa指针:
在arm64之前,isa就是一个普通的指针,里边就是直接存储类对象和元类对象的地址值,但是在arm64开始,isa经过了优化,采取共用体的结构,将8个字节 64位的内存数据,分开存储了很多东西,其中33位才是拿来存储具体的地址值。
Isa指针的作用:
Isa指针指向的是class结构体的地址值,OC主要有三个对象,实例对象,类对象,元类对象。
- 实例对象包括isa指针和其他成员变量,
- 类对象包括isa指针,父类指针,方法列表,属性列表,成员变量,协议列表之类信息,
- 元类对象跟类对象结构相同,只是除了方法列表其他为null。
当你为实例对象,你想要调用方法的时候,就需要获取到实例方法的地址,而这个地址就保存在类对象中,那么isa指针通过一个位移运算,能够找到类对象,从而取出其中的实例方法调用,同理,类对象调用方法也是通过isa指针找到元类方法去调用。
因此isa指针是连接三个对象的桥梁,能够使程序正常运行。
自己理解
isa指针,实例对象,类对象,元类对象,只是人为起的一个称呼,其实就是class结构体,通过一个isa指针指向了那个结构体,然后可以使用结构体内部的一些属性。比如,从属性列表中取出属性,方法列表中取出方法。
class结构体指的是类对象和元类对象的结构。
实例对象和类对象的成员变量区别
实例对象存放的具体的值,类对象存放的成员信息,姓名,内存大小,类型。