OC对象本质

  1. 一个Person对象、一个Student对象占用多少内存空间?

    image.png

  2. 创建⼀个实例对象⾄少需要多少内存?

    #import <objc/runtime.h>
    class_getInstanceSize([NSObject class]);
    
  3. 创建⼀个实例对象实际分配多少内存

    #import <malloc/malloc.h>
    malloc_size((__bridge const void *)obj);
    
  4. OC对象的分类

    1. Instance对象(实例对象)

      NSObject *instance.  = [NSObject class];
      
      • 通过类alloc出来的对象, 每次调⽤alloc都会产⽣新的instance对象
      • 不同的实例对象占据不同的内存
      • 实例对象在内存中存储的信息包括: isa指针, 其他成员变量
    2. Class对象(类对象)

      Class objectClass = [NSObject class];
      
      • 类在内存中有且只有⼀个class对象
      • class对象在内存中存储的信息包括:
        • isa指针
        • superclass指针
        • 类的属性信息(@property)
        • 类的对象⽅法信息(instance method)
        • 类的协议信息(protocol)
        • 类的成员变量信息(ivar)
    3. meta-class对象(元类对象)

      //将类对象当做参数传⼊ 获得元类对象 runtime函数
      Class objectMetaClass = object_getClass([NSObject class]);
      

      注意 [xxx class]⽅法返回的是类对象 ⽆论调多少次

      • 每个类在内存中有且只有⼀个元类对象
      • meta-class对象在内存中存储的信息包括 (内存结构和class对象⼀样, ⽤途不⼀样)
        • isa指针
        • superclass指针
        • 类的⽅法信息(class method)
  5. object_getClass内部实现

    Class objc_getClass(const char * aClassName)
    
    1. 传⼊字符串类名
    2. 返回对应的类对象
    Class object_getClass(id obj)
    
    1. 传⼊的obj可能是instance对象셅 class对象셅 meta-class对象
    2. 返回值
      1. 如果传⼊是instance对象셈 返回class对象
      2. 如果传⼊是class对象셈 返回meta-class对象
      3. 如果传⼊是meta-class对象셈 返回NSObject的meta-class对象셋
    -(Class)class;
    +(Class)class;
    

    返回就是类对象

  6. isa、superclass 指针

    实例对象的isa 指针指向哪里:

    1. Instance的isa指向class,当调用对象方法时,通过instance 的isa找到 class,最后找到对象方法的实现进行调用;
    2. class的isa指向 meta-class,当调用类方法是,通过 class的isa 找到 meta-class,最后找到类方法的实现进行调用;

    Class 对象的superclass指针:

    当子类的instance 对象要调用父类的instance 方法时,会先通过isa 找到子类的 class,再通过superclass找到父类的class,最后找到instance 方法实现调用;

    meta-class 对象的superclass 指针:

    当子类的class要调用父类的class方法时,会先通过isa找到子类的meta-class,再通过superclass找到父类的meta-class,最后找到class方法的实现进行调用;

  7. isa、superclass 总结

    instanceisa指向Class Classisa指向 MetaClass MetaClassisa指向基类的MetaClass

    classsuperclass指向父类的class <1>如果没有父类,superclass指针为nil meta-class的 superclass 指向父类的meta-class <1>基类的meta-Class 的superclass 指向基类的 Class Instance 调用对象方法过程 <1>isa 找到 class,方法不存在,就通过superclass找父类 Class 调用类方法过程 <1>isa找meta-class,方法不存在,就通过superclass找父类

    image.png

  8. dada

  9. adad