网络上有一张经典的图,如下:
这张图的大概意思就是:实例对象的isa指针指向其类,该类的isa指针指向其元类(MetaClass),而其元类的isa指针指向NSObject的元类,而NSObject的元类的isa指针指向自己。
下面通过代码来证明一下正确性:
NSObject *obj = [[NSObject alloc] init ]; //实例化一个NSObject对象
Class objClass = [obj class]; //获取该实例对应的类
Class metaClass1 = object_getClass(objClass); //获取该类对应的元类
Class metaClass2 = object_getClass(metaClass1); //获取该元类的元类
//打印地址
NSLog(@"obj: %p",obj);
NSLog(@"objClass: %p",objClass);
NSLog(@"metaClass1: %p",metaClass1);
NSLog(@"metaClass2: %p",metaClass2);
运行结果如下:
2021-03-15 23:32:40.304400+0800 Person[41519:4009886] obj: 0x1059052a0
2021-03-15 23:32:40.305073+0800 Person[41519:4009886] objClass: 0x7fff88999cc8
2021-03-15 23:32:40.305125+0800 Person[41519:4009886] metaClass1: 0x7fff88999ca0
2021-03-15 23:32:40.305183+0800 Person[41519:4009886] metaClass2: 0x7fff88999ca0
Program ended with exit code: 0
从打印结果来看,metaClass1与metaClass2指向的地址是一样的,这也就证明了NSObject的元类的isa指针指向自己。