iOS底层原理笔记 - OC对象的分类

159 阅读1分钟

OC对象主要分三种:

instance对象(实例对象)

class对象(类对象)

meta-class对象(元类对象)

instance(实例对象)

instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象;

NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
  • obj1,obj2是 NSObject 的 instance 对象(实例对象)
  • 它们是两个不同的对象,占用着两块不同内存

instance对象在内存中存储的信息包括

  • isa指针
  • 其他成员变量
Class(类对象)
Class objClass1 = [obj1 class];
Class objClass2 = [obj2 class];
Class objClass3 = [NSObject class];
Class objClass4 = object_getClass(obj1); //runtime API
Class objClass5 = object_getClass(obj2);
  • objClass1 ~ objClass5都是NSObject的class对象;
  • 它们是同一个对象,每个类在内存中有且只有一个class对象;
  • class对象在内存中的存储信息主要包括:
  1. isa指针
  2. superclass指针
  3. 类的属性信息(@property)、类的对象方法信息(instance method)
  4. 类的协议信息(protocol)、类的成员变量信息(ivar)
meta-class(元类对象)
Class metaObj = object_getClass([NSObject class]); //runtime API
  • metaObj 是 NSObject 的 meta-class 对象(元类对象);
  • 每个类在内存中有且只有一个meta-class;
  • meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中的存储信息主要包括
  1. isa指针
  2. superclass指针
  3. 类的类方法信息(class method)

查看class 是否为 meta-class?

class_isMetaClass([[NSObject class] class])

BOOL isMetaClass = class_isMetaClass(object_getClass([NSObject class]));
NSLog(@"是否是元类对象%d",isMetaClass);  //1
        
BOOL isMetaClass2 = class_isMetaClass([[NSObject class] class]);
NSLog(@"是否是元类对象%d",isMetaClass2); //0

以下代码获取的objectClass是class对象,并不是meta-class对象

Class objClass = [[NSObject class] class];