首先咱们建立一个继承于NSObject的CFPerson类,在mian 函数初始化,再加一个断点markdown
#import "CFPerson.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
CFPerson *person = [CFPerson alloc];
NSLog(@"Hello, World! %@",person);
}
return 0;
}
复制代码
接下来看看打印信息函数
当前类信息spa
p/x 0x0000000100002150 拿到元类code
**元类&**0x0000000ffffffff8ULL打印出获得一个地址orm
在打印元类的指向,可获得内存信息对象
po 0x00000001003340f0获得NSObject类继承
以上打印可分析拟草一个类对象执行过程指向图:内存
咱们再来验证一下:get
打印结果发现0x0000000100334140地址不同,并非NSObject类,那么它可能会是什么呢?多是第二个NSObject类。it
咱们知道类的信息在内存里永远只存在一份。
贴上代码
void cfTestClassNum(){
Class class1 = [CFPerson class];
Class class2 = [CFPerson alloc].class;
Class class3 = object_getClass([CFPerson alloc]);
Class class4 = [CFPerson alloc].class;
NSLog(@"\n%p-\n%p-\n%p-\n%p",class1,class2,class3,class4);
}
复制代码
看下打印结果:
能够看出类对象地址都同样,所以类的信息在内存里永远只存在一份
怎样拿到元类?
首先打印当前地址拿到当前iso,经过当前的iso&ISA_MASK 0x0000000ffffffff8ULL,变可获得一个地址0x00000001003340f0,于以前po打印的NSObject地址0x00000001003340f0相等,所以它并非NSObject类,而是NSObject元类(根元类)
此刻已经到了根元类,再往下走
继续打印当前地址iso信息便会获得根元类的iso,拿到根元类iso再&ISA_MASK 0x0000000ffffffff8ULL获得地址0x00000001003340f0,再再打印其内存状况。
此刻咱们发现其内存地址信息与以前的同样,这便意味着NSObject根元类仍是指向NSObject根元类,即指本身,那么以前拟草的类对象执行过程指向图得更新一下了:
对于NSObject没有元类的指向,其他定义的类都知足实例对象Instance of Superclass[class]——>当前类Subclass[class]——>当前元类Superclass[class]