OC对象的本质

我们在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


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容