我们在main函数内创建一个instance对象
NSObject *obj = [[NSObject alloc] init];
使用终端 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc 将oc代码转换成c\c++代码得知如下:
根据以上输出结果我们可以理解为 其实NSObject的本质就是一个isa指针
如果我们写一个实例类如:
再将其转为c/c++代码发现Pesron类底层实现:
struct Person_IMPL {
structNSObject_IMPLNSObject_IVARS;
int_age;
int_height;
};
如此得出结论:
instance对象在内存中存储的信息:
a)isa指针
b)其他成员便利
如果instance对象内部只存储isa指针和其他成员变量,那么方法是存在那里的?如何实现的调用?
根据以上疑问,我们发现除啦instance对象以外还有一个class对象.
根据以上代码我们发现:
1.objectClass1 ~objectClass5都是NSObject的class对象(类对象)
2.它们是同一个对象。每个类在内存中有且只有一个class对象
3.class对象在内存中存储的信息主要包括
4.isa指针
a)superclass指针
b)类的属性信息(@property)、类的对象方法信息(instance method)
c)类的协议信息(protocol)、类的成员变量信息(ivar)
再次产生疑问 类方法是存储在哪里呢?
再次深究发现其实还有个meta-class(元类对象)
1.objectMetaClass是NSObject的meta-class对象(元类对象)
2.每个类在内存中有且只有一个meta-class对象
3.meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
4.isa指针
5.superclass指针
6.类的类方法信息(class method)
我们可以通过runtime 的class_isMetaClass([NSObject class])来判断class是否为meta-class
总结啦这么多发现每个对象内部都有isa指针而且类对象和元类对象还有一个superClass指针那么这两个指针的具体用处是什么呢?
如图:
如图我们得出总结:
1.instance的isa指向class
2.class的isa指向meta-class
3.meta-class的isa指向基类的meta-class
4.class的superclass指向父类的class,如果没有父类,superclass指针为nil
5.meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class
6.instance调用对象方法的轨迹,isa找到class,方法不存在,就通过superclass找父类
7.class调用类方法的轨迹,isa找meta-class,方法不存在,就通过superclass找父类
我们了解清楚isa指针后那么class结构是什么样的呢?
根据objc4的源码我们了解到class、meta-class对象的本质结构都是struct objc_class
并且得知在64bit开始,isa&ISA_MASK,才能计算出真是的地址.
简单窥探struct objc_class