一、类分析
在我们日常使用中都是创建类都是继承自NSObject,在底层把我们的类编译成什么样子,我们也不是很清楚,今天我们把项目编译成c++源码来看一看类编译成什么样子。
首先我们创建一个项目,创建一个类,并将这个类用clang指令转换成c++编码。
创建一个新类
clang命令将main转换成cpp编码
打开cpp编码可以看到lengli这个类的类型是objc_object。我们看到这个方法指向的是objc_class。继续搜索我们没有看到objc_class的实现,所以我们回到源码继续搜索。
在源码中搜索objc_class,在objc-runtime-new.h 文件中看到了它的实现。
objc_class实现
看到这里可以看到objc_class继承的是objc_object,这也验证经典名句万物皆对象......。也就是说类也是一种对象。
二、类的结构
从上面的类分析中可以看出来,objc_class里面定义了有4个属性,剩下的都是实现。
- isa指针
- superclass指针
- cache
- bits
这里isa指针是父类的,所以这里显示的是注释。
2.1isa指针
这里的isa是类与元类关联使用的。具体isa可以看上一篇文章。
2.2superclass指针
superclass指针看名字就可以看出来是指向父类的。
2.3cache
点进去看cache_t结构体,再继续点bucket_t,可以看到MethodCacheIMP这个属性,从字面上看cache这个应该是缓存类方法的,具体操作本篇不在讨论。
bucket_t结构体
2.4bits
下面的结构体中可以看到setData方法是给bits的data赋值,赋值的类型是class_rw_t,点进class_tw_t我们看看具体给的是什么内容。
来到class_tw_t我们可以看到里面的存储量methods、properties、protocols这些都是我们熟悉的内容。
class_tw_t
本章只是针对类进行分析查看类的结构,cache、bits将另外分出两篇文章再做探索。