OC中类对象,主要分为一下三种:
(1).instance对象(实例对象)
(2).class对象 (类对象)
(3).meta-class对象(元类对象)
一、instance对象(实例对象)
instance对象是通过类alloc init
出来的对象,每次alloc init
都会产生新的instance对象。
Person *person1 = [[Person alloc]init];
Person *person2 = [[Person alloc]init];
比如:person1和person2是两个不同的对象,分别占据着不同的内存空间。
instance在内存中存储的内存信息包括:
1.isa指针
2.其它成员变量
.......
二、class对象 (类对象)
通过以下方法可以获得类对象,每个类在内存中有且只有一个class对象。
class对象在内存中存储的信息主要包括:
1.isa指针
2.superclass指针
3.类的属性信息,类的对象方法信息等
.......Class personClass1 = [person1 class]; Class personClass2 = [Person class]; Class personCalss3 = object_getClass(person1); NSLog(@"---personClass1:%p",personClass1); NSLog(@"---personCalss2:%p",personClass2); NSLog(@"---personCalss3:%p",personCalss3);
输出结果如下:
2020-01-04 14:21:07.039798+0800 ClassDemo[7590:109290] ---personClass1:0x10c03c588 2020-01-04 14:21:07.039966+0800 ClassDemo[7590:109290] ---personCalss2:0x10c03c588 2020-01-04 14:21:07.040110+0800 ClassDemo[7590:109290] ---personCalss3:0x10c03c588
三、meta-class对象(元类对象)
每个类在内存中只要一个meta-calss类。
meta-class在内存中存储的主要信息:
1.isa指针
2.superclass指针
3.类的类方法信息
......
例:Person *person1 = [[Person alloc]init]; Class personClass1 = [person1 class]; // 元类对象 Class metaClass = object_getClass(personClass1); NSLog(@"---personClass1:%p",personClass1); NSLog(@"---metaClass:%p",metaClass);
输出结果如下:
2020-01-04 14:41:00.913734+0800 ClassDemo[8504:147077] >---personClass1:0x1043e4588 2020-01-04 14:41:00.913919+0800 ClassDemo[8504:147077] >---metaClass:0x1043e4560
【小结】:
下面这张图诠释了isa和superclass的精髓。
【isa】
① instance(实例)对象的ISA指向Class(类)对象。
② class对象的ISA指向meta-class(元类)对象。
③ meta-class对象的ISA指向基类meta-class.【superclass】
① class对象的superclass指向父类的类对象。
如果没有父类,superclass指针为nil
②meta-class的superclass指向父类的meta-class
③基类的meta-class的superclass指向基类的class
OC中类对象的学习记录在这里。