类的本质及启动过程
1. 【了解】类的本质
2. 【掌握】如何获取类对象
3. 【理解】类对象的用法
4. 【理解】类对象的存储
5. 【了解】OC实例对象类对象元数据之间关系
1.类的本质
- 类的本质其实也是一个对象(类对象)
- 程序中第一次使用该类的时候被创建,在整个程序中只有一份。
- 此后每次使用都是这个类对象,它在程序运行时一直存在。
- 类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本,继承层次,以及消息与函数的映射表等
- 类对象代表类,Class类型,对象方法属于类对象
- 如果消息的接收者是类名,则类名代表类对象
- 所有类的实例都由类对象生成,类对象会把实例的isa的值修改成自己的地址,每个实例的isa都指向该实例的类对象
2.如何获取类对象
- 通过实例对象
格式:[实例对象 class ];
如: [dog class];
- 通过类名获取(类名其实就是类对象)
格式:[类名 class];
如:[Dog class];
3.类对象的用法
- 用来调用类方法
[Dog test];
Class c = [Dog class];
[c test];
- 用来创建实例对象
Dog *g = [Dog new];
Class c = [Dog class];
Dog *g1 = [c new];
4.类对象的存储
5.OC实例对象 类对象 元对象之间关系
- Objective-C是一门面向对象的编程语言。
+ 每一个对象 都是一个类的实例。
+ 每一个对象 都有一个名为isa的指针,指向该对象的类。
+ 每一个类述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。
+ 每一个对象都可以接受消息,而对象能够接收的消息列表是保存在它所对应的类中。
- 在Xcode中按Shift + Command + O打开文件搜索框,然后输入NSObject.h和objc.h,可以打开 NSObject的定义头文件,通过头文件我们可以看到,NSObject就是一个包含isa指针的结构体,
下面这张图或许能够 让大家对isa和继承的关系清楚一些
上图中,最让人困惑的莫过于Root Class了。在实现中,Root Class是指
NSObject,我们可以从图中看出:
- NSObject类对象包括它的对象实例方法。
- NSObject的元对象包括它的类方法,例如new方法。
- NSObject的元对象继承自NSObject类。
- 一个NSObject的类中的方法同时也会被NSObject的子类在查找方法时找到
类的启动过程
1. 【掌握】\+load方法
2. 【掌握】\+initialize方法
1.\+load方法
- 在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法(只会调用一次)
- 先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load
- 先加载元原始类,再加载分类
- 不管程序运行过程有没有用到这个类,都会调用+load加载
2.\+initialize
- 在第一次使用某个类时(比如创建对象等),只会调用一次+initialize方法
- 一个类只会调用一次+initialize方法,先调用父类的,再调用子类的