底层原理:OC对象的分类

2022-02-26  本文已影响0人  飘摇的水草

在了解OC对象在内存的本质后,那么我们进一步思考,OC对象是怎么分类的呢?每个类的作用,以及之间的联系又是怎么样呢?

Objective-C中的对象,简称OC对象,主要可以分为3种:

instance对象
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];

如图我们可以看到p1和p2是通过JJPerson的alloc方法创建出来的instance对象(实例对象),它们是两个不同的对象,有着不同的内存地址。

instance对象的内容

每个对象内部都有isa指针,instance对象在内存中存储的信息包括:

isa排在首位,所以isa所指向的地址也是instance对象所在的地址,指针object1里存放的就是isa的地址值

类对象
Class class1 = [person class];
Class class2 = [NSObject clasd]
Class class3 = object_getClass(person)
NSLog(@"class - %p %p %p",class1,class2,class3);
Class objectClass = [[NSObject class]class]
meta-class对象(元类对象)

元类对象是通过runtime的object_getClass方法获取的,和类对象不同的是,类对象获取时需要传入的参数是实例对象,而获取元类对象时则要把类对象作为参数传入。如下图我们可以看到,元类对象在整个内存中也只有一份。

Class metaClass = object_getClass([NSObject class]);

另外runtime还提供了一个class_isMateClass的方法来方便我们判断,这个类是否是元类对象

#import <objc/runtime.h>
BOOL result = class_isMetaClass([NSObject class]);
object_getClass内部实现
上一篇 下一篇

猜你喜欢

热点阅读