类的结构探索

准备工做

首先咱们建立一个继承于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]

相关文章
相关标签/搜索