OC中类的本质总结

2020-07-04  本文已影响0人  Sherlock_Jim

1.什么是类加载?

在创建对象的时候,肯定是需要访问类的.所以在程序运行期间,当某个类第一次被访问到的时候,会将这个类存储到内存中的代码段区域,这个过程叫做类加载.

只有类在第一次被访问的时候,才会做类加载,一旦类被加载到代码段以后,直到程序结束的时候才会被释放.

2.类对象的获取方式和在内存中存储的信息包括哪些?

获取类对象方式和类对象在内存中存储的信息

3.类对象在内存中的真实结构(struct objc_class)

struct objc_class 的本质结构

4.元类对象(meta - class)的获取方式 

ps:只有通过object_getClass()这个RuntimeAPI才能获取meta-class对象 , 无论使用多少次class方法只能获取class对象.

元类对象的获取方式 元类对象打印的地址值 是不同于类对象的

5.元类(meta-class)对象的内部结构

元类对象的内部结构

meta-class对象和class对象的内存结构是一样的,只是说在meta-class对象中的类方法信息是有值的,而class对象中的类方法信息是null,同样在class对象中属性信息、对象方法信息、协议信息、成员变量信息这些是有值的,而类方法信息是null.

6.关于返回类对象还是元类对象的方法总结

1.Class objc_getClass(const char *aClassName)

1>传入字符串对象

2>返回对应的类对象

2.Class object_getClass(id obj)

1>传入的obj是OC对象,OC对象包括instance对象、class对象、meta-class对象.

2>返回值

a.如果是instance对象,返回class对象.

b.如果是class对象,返回meta-class对象.

c.如果是meta-class对象,返回NSObject(基类)的meta-class对象.

3.-(Class)class、+(Class)class

1>返回的就是类对象

7.关于isa、superclass总结

isa、superclass的总结

1)instance调用对象方法的轨迹

通过isa指针找到class对象,如果class对象里这个对象方法不存在,就通过superclass指针找父类class对象,如果没有就一直通过superclass指针找父类class对象,一直找到NSObject类对象,NSObject类对象里还没有要找的对象方法,就报unrecognized selector sent to class.

2)class调用类方法的轨迹

通过isa指针找到元类对象,如果类方法不存在,就通过superclass指针找父元类对象,一直找到NSObject元类对象,如果NSObject元类对象也没有这个类方法,还会通过superclass指针去找NSObject类对象,如果NSObject类对象里还是没有要找的类方法,就报错.

8.对象的isa指针指向哪里?

1)instance对象的isa指向class对象.

2)class对象的isa指向meta_class对象.

3)meta-class对象的isa指向基类的meta-class对象.

9.OC的类信息存放在哪里?

1)对象方法、属性、成员变量、协议信息,存放在类对象里.

2)类方法,存放在meta-class对象中.

3)成员变量的具体值,存放在instance对象中.

上一篇 下一篇

猜你喜欢

热点阅读