题记
在了解OC对象在内存的本质后,那么我们进一步思考,OC对象是怎么分类的呢?每个类的作用,以及之间的联系又是怎么样呢?
正题
Object-C中的对象简称OC对象,主要分为以下3种:
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
那么这三种对象有什么不一样呢?首先我们来看instance对象:
instance对象
instance对象是通过类用alloc方法创建出来的对象,每次调用alloc都会产生新的instance对象。首先我们定义一个JJPerson类
我们通过alloc方法来创建JJPerson的instance对象
如图我们可以看到p1和p2是通过JJPerson的alloc方法创建出来的instance对象(实例对象),它们是两个不同的对象,有着不同的内存地址。
instance对象的内容
- instance对象里面存放着isa指针以及成员变量
- isa排在首位,所以isa所指向的地址也是instance对象所在的地址
类对象
通过class方法获取的,或者通过runtime的object_getClass方法都能获取到类对象,由于一个类对象在内存中只有一份,所以我们可以看到,无论哪个方法获取到的内存地址都是一样的。
类对象的内容
由于类对象在整个内存中只有一份,所以我们可以很容易联想到,那些在类中只需要一份的信息都会存储在类对象中
- isa指针
- superClass指针
- 类的属性信息(@property)、对象方法信息(instance method)、协议信息(protocol)、成员变量信息(ivar)
meta-class对象:
元类对象是通过runtime的object_getClass方法获取的,和类对象不同的是,类对象获取时需要传入的参数是实例对象,而获取元类对象时则要把类对象作为参数传入。如下图我们可以看到,元类对象在整个内存中也只有一份。
元类对象的内容
- isa指针
- superClass指针
- 类的类方法信息
-
meta-class对象和class对象的内存结构是一样的,但是用途不一样
另外runtime还提供了一个class_isMateClass的方法来方便我们判断,这个类是否是元类对象
疑问
每个对象都会有一个isa指针,它是有什么用,每种对象之间又有什么关联呢?我们下一篇继续分析。