【MJ-iOS底层原理总结】实例对象、类对象、元类对象

189 阅读2分钟
  1. OC对象主要可以分为3种:
    • instancet对象(实例对象)
    • class对象(对象)
    • meta-class对象(元类对象)
  2. instancet对象:
    • instancet对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
      NSObject *object1 = [[NSObject alloc] init];
      NSObject *object2 = [[NSObject alloc] init];
      
      object1、object2是NSObject的instance对象实例对象),他们是不同的两个对象,分别占据 着两块不同的内存。
    • instancet对象存储的信息
      1. isa指针
      2. 其他成员变量
  3. class对象:
    • 获取class对象的三种方法:

      NSObject *obj1 = [[NSObject alloc] init];
      NSObject *obj2 = [[NSObject alloc] init];
      Class objectClass1 = [obj1 class];
      Class objectClass2 = [obj2 class];
      Class objectClass3 = [NSObject class];
      Class ObjectClass4 = object_getClass(obj1);
      Class ObjectClass5 = object_getClass(obj2);
      

      objectClass1 ~ objectClass5都是同一个对象,每个类在内存中只有一个class对象。

      在编译器中进行验证:不管用什么方式获取类对象,内存地址都一样image.png

    • class对象存储的信息

      1. isa指针
      2. superclass指针
      3. 类的属性信息(@property)
      4. 类的对象方法信息(instance method)
      5. 类的协议信息(protocol)
      6. 类的成员变量信息(ivar):这个指的不是成员变量的值,而是成员变量的类型、名称相关信息
    • 总结:class对象中存储的信息都是只需要存一份的信息

  4. meta-class对象:
    • 获取meta-class对象的方法:

      Class objectMetaClass = object_getClass([NSObject class]);
      

      通过object_getClass方法,传入类对象,即可获得元类对象。 每个类在内存中只有一个meta-class对象。

      在编译器中进行验证:发现元类对象的地址和类对象的地址不一样 image.png

    • meta-class对象和class对象的内存结构是一样的,因为都是Class指针指向,但是用途不一样,在内存中存储的信息主要包括:

      1. isa指针
      2. superclass指针
      3. 类的类方法信息(class method)