通过isa
推导class
我们分析类isa
存储了类信息,我们是否可以对Class
的地址再取isa
的操作呢?
通过案例我们发现对isa
的地址再进行x/4gx
时也可以获取到里面的地址值,并同isa
的取isa_mask
一样结果得到类YDPerson
,What this is ?
难道类会和对象一样无限开辟?内存中不止有一个类吗?
于是添加了ydTestClassNum
函数来测试类对象内存存在的个数,通过打印发现都为0x1000080f8
,证明了类对象在内存中只有一个
问题
0x00000001000080d0
是什么?难道是NSObject
吗?
通过打印测试发现0x00000001000080d0
不是NSObject
通过lldb
调试知道对象的isa
指向了Class
(0x00000001000080f8
),而Class
的isa
指向了0x00000001000080d0
通过MachOView
查看编译好的mach-o
文件
通过符号表发现在编译好的mach-o
文件中,地址0x00000001000080d0
被编译成了MetaClass
(元类),这是由系统添加的并且已经编译好了
总结
相同的类在内存中会只存在一份
对象的isa
指向了类,类的isa
指向了元类