class、metaclass 、isa、superclass?

首先通过上面图可以就基本可以读懂Instance,class ,metaclass的关系

  • Instance对象主要放变量的具体值(如创建了多个对象变量值也可能不同,这是存放它具体值得)
  • Class对象主要是放属性成员变量对象方法协议
  • MetaClass对象是存放类方法 (他的结构和Class一样的,只是其他值为NULL)

1. 他们的isa指向什么?

  • Instance对象的isa指向类
  • Class对象的isa指向元类
  • MetaClass对象的isa指向根元类

2.他们的superclass指向什么?

  • Class对象的superclass指向 (如Student对象 superclass是Person)
  • MetaClass对象的superclass指向父元类(如子元类superclass指向父元类,根元类superclass指向根类,如果没有指向nil(如NSObject))

3.调用类方法不存在,如果根类有实例方法会怎么样?如[Student sleep]

答案:他会调用- (void)sleep;  它并不会包unregnized selector,主要看他的消息转发流程如下:

  1. 首先去Student通过isa直接找metaclass 看是否在Student元类中,如果存在就消息转发。不存在+(void)sleep就根据superclass找父元类
  2. 父元类如果不存在再一直找父元类… 根元类。如果根元类不存在就根据superclass找到根类(NSObject)
  3. 在根类中找到了-(void)sleep;就消息转发(根类是类就是存对象方法的)
  4. 如果根类也没有的话,就走消息转发流程 resolveClassMethod: 这个流程….

4.objc_getClass、object_getClass、class什么区别?

objc_getClass:(返回类对象,并没有元类)实现如下

也就是它返回的是类对象(好处:可以上找父类)

class: 始终返回类对象([[ [student class]class]class]也是类对象,不是元类)

object_getClass: 参数是对象返回类,参数是类对象返回元类对象.. (他是通过isa获取的)

5.对象的isa地址和它类的地址一致吗? 类的isa地址和它元类地址一致吗?

在64bit后 isa的地址要位运算&值才一致如:

  • 对象isa& ISA_MASK才是类对象地址
  • 类对象isa&& ISA_MASK才是元类对象地址

6.isa什么类型?objc_class ?

isa是Class类型,也就是一个结构体指针如下:

查看objc_class内存上表现结构:

其中源码地址:https://opensource.apple.com/tarballs/objc4/

发表回复

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud