1.什么是类加载?
在创建对象的时候,肯定是需要访问类的.所以在程序运行期间,当某个类第一次被访问到的时候,会将这个类存储到内存中的代码段区域,这个过程叫做类加载.
只有类在第一次被访问的时候,才会做类加载,一旦类被加载到代码段以后,直到程序结束的时候才会被释放.
2.类对象的获取方式和在内存中存储的信息包括哪些?
![](https://img.haomeiwen.com/i2660746/abf6eb4a20ae7ffe.jpg)
3.类对象在内存中的真实结构(struct objc_class)
![](https://img.haomeiwen.com/i2660746/296419f9648c1938.jpg)
4.元类对象(meta - class)的获取方式
ps:只有通过object_getClass()这个RuntimeAPI才能获取meta-class对象 , 无论使用多少次class方法只能获取class对象.
![](https://img.haomeiwen.com/i2660746/a9bff3d41ad249bb.jpg)
![](https://img.haomeiwen.com/i2660746/c5dae52fe18ab903.jpg)
5.元类(meta-class)对象的内部结构
![](https://img.haomeiwen.com/i2660746/bdc97235077ac834.jpg)
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总结
![](https://img.haomeiwen.com/i2660746/3948b2f170be434c.jpg)
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对象中.
网友评论