关于类首先我们都知道我们再创建一个类的时候都会继承与NSObject,那么NSObject中是怎么实现的。我们创建的类和NSObject之间是不是还有其他的东西存在?本文就对此进行一些简单的探索。
类 元类 根元类
·类 类实际上就是一个对象。
·元类 什么是元类?例如LYHPerson类也是一个对象。那么他肯定是有一个类实例化得到的,这个类就是元类。
·根元类 根元类 就是元类实例化得到的。也就是我们所说的NSObject。
探索过程如图所示:
首先我们打印出一个类的x/4gx一个类,可以打印出这个类的内存地址的情况。我们拿到首地址(即类的指针地址),&MASK得出 0x00000001000022e8 这个地址。我们打印这个地址就能得出当前这个类的类名。
然后我们继续对 这个地址进行x/4gx 我们就能得出一个新的内存地址的情况,然后用同样的方法 有打印出了一个LYHPerson 0x00000001000022c0。那么这个LYHPerson就是元类。
我们继续进行操作就能得出0x00000001003340f0 这样一个地址。打印这个地址就能得出NSObject。就证明了NSObject是LYHPerson的根元类。
继承
如果此时我们继承LYHPerson创建一个LYHTeacher,LYHPerson *person;LYHTeacher *teacher,此时person和teacher是没有关系的。只有LYHPerson和LYHTeacher是存在继承关系。那么此时的继承关系就是LYHTeacher继承于LYHPerson,LYHPerson又继承于NSObject,NSObject继承于nil。为什么NSObject继承于nil呢。是因为NSObject就是类的基础,是一个从无到有的过程。
了解了类的整个过程之后 上图我们就能知道上图的整个流程。
类的分析
对于类的分析 首先我们看一张源码的截图,如图所示
图中objc_object 和 objc_class是什么呢?objc_object是我们创建所有对象的根对象,而objc_class是继承于objc_object的,而objc_class包含了我们创建对象的所有信息。怎么印证呢?
首先我们再LYHPerson里面创建一个属性 name如图:
然后我们通过对地址的访问一步步的获取到内容。具体操作如图所示
通过这两张图,最后通过打印*$8我们就得到了LYHPerson中的name属性。这就印证了objc_class里面储存了 我们创建的类的所有信息这句话。