笔记:
OC类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针
objc_class结构体中重要的字段:
- isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。元类保存了类方法的列表。当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass).根元类的isa指针指向本身,这样形成了一个封闭的内循环。
- metaClass:我们向一个对象发送消息(调用对象方法)时,runtime会在这个对象的所属类的方法列表中查找响应方法;而向一个类发送消息(调用类方法)时,会在这个类的meta-class的方法列表查找响应方法。
Objective-C的设计者让所有的meta-class的isa指向基类的meta-class,以此作为它们的所属类。即,任何NSObject继承体系下的meta-class都使用NSObject的meta-class作为自己的所属类,而基类的meta-class的isa指针是指向它自己。这样就形成了一个完美的闭环。 - super_class:指向该类的父类,如果是根类的话,则super_class为NULL
- cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。在实际使用中,这个对象只有一部分方法是常用的,很多方法其实很少用或者根本用不上。这种情况下,如果每次消息来时,我们都是methodLists中遍历一遍,性能势必很差。这时,cache就派上用场了。在我们每次调用过一个方法后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果cache没有,才去methodLists中查找方法。这样,对于那些经常用到的方法的调用,但提高了调用的效率。
- version:我们可以使用这个字段来提供类的版本信息。这对于对象的序列化非常有用,它可是让我们识别出不同类定义版本中实例变量布局的改变。
- info:供运行期使用的一些位标识。
- instance_size:该类的实例变量大小
- ivars:成员变量的数组
EXAMPLE:
1 | //----------------------------------------------------------- |
动态创建类和对象
动态创建类:
1 | Class cls = objc_allocateClassPair(MyClass.class, "MySubClass", 0); |
动态创建对象:
1 | id theObject = class_createInstance(NSString.class, sizeof(unsigned)); |
实例操作函数:
针对整个对象进行操作的函数
1
2
3
4NSObject *a = [[NSObject alloc] init];
id newB = object_copy(a, class_getInstanceSize(MyClass.class));
object_setClass(newB, MyClass.class);
object_dispose(a);针对对象实例变量进行操作的函数
针对对象的类进行操作的函数
获取类定义:
1 | int numClasses; |
方法汇总:
1 | // 获取类的类名 |