iOS Objective-C isa 走位分析
1. 判断isa是对象的第一个属性
isa<-->cls的关联 (类和对象的关系)
image
可以看出类的指针与类对象第一个属性去掉低3位与高17位的值是完全一样的。同时也验证了:isa的 shiftcls 存储的是类指针的值。
通过object_getClass获取类,
image
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
inline Class objc_object::getIsa()
{
if (!isTaggedPointer()) return ISA();
·····
}
inline Class objc_object::ISA()
{
#if SUPPORT_INDEXED_ISA
·····
#else
return (Class)(isa.bits & ISA_MASK); //(isa.bits & ISA_MASK)
#endif
}
类和对象通过isa关联,isa为类对象的第一个属性。
2.isa 的指向分析
isa的终极指向分析:
image
结论:
- 对象 - 程序员根据类 -> 实例化
- 类 - 代码写出来的 - 内存只有一份 - 不是我创建 - 系统
- 元类 - 系统编译的 - 发现有了这么一个类 - 系统也同时创建了
- 对象 -> 类对象 -> 元类 -> 根元类 -> 根元类
- NSObject/NSProxy: 根类 -> 根元类
经典图解:(图中虚线代表isa指向关系,实线代表类的继承关系。)
image
<font color=Red>其中NSObject根元类继承自NSObject,NSObject继承自nil蓝色</font>
网友评论