美文网首页
OC对象的分类

OC对象的分类

作者: sajiner | 来源:发表于2018-09-27 22:44 被阅读4次

    Objective-C对象的分类

    Objective-C中的对象也叫OC对象,主要分为三类:
    1.实例对象(instance对象)
    2.类对象(class对象)
    3.元类对象(meta-class对象)

    1. 实例对象(instance对象)

    • instance对象:通过类alloc创建出来的对象,每次调用alloc都会创建出新的instance对象。
    • 在内存中的存储信息包括:
      isa指针
      其他成员变量
    • 结构:
    struct NSObject_IMPL {
        Class isa;
        NSString *_name;
    };
    

    2. 类对象(class对象)

    • 类在内存中有且仅有一个class对象
    • 存储信息包括:
      isa指针
      superclass指针
      属性信息
      成员变量信息
      对象方法
      协议
    • 结构


      类对象的结构.png

    3. 元类对象(meta-class对象)

    • 每个类在内存中有且仅有一个meta-class对象
    • meta-class对象和class对象的内存结构一样,但是用途不一样
    • 存储信息包括:
      isa指针
      superclass指针
      类方法
    • 结构:同2

    isa指针与superclass指针

    isa指针与superclass指针.png

    由图可知:

    • isa
      1> instance对象的isa指针指向class对象
      2> class对象的isa指针指向meta-class对象
      3> meta-class对象的isa指针指向基类的meta-class对象
      4> 基类的meta-class对象的isa指针指向自己

    • superclass
      1> class对象的superclass指针指向父类(如果没有父类,superclass指向nil)
      2> meta-class对象的superclass指向父类的meta-class(基类的meta-class对象的superclass指向基类的class对象)

    • instance对象调用对象方法的轨迹
      1> 通过instance对象的isa指针找到class对象,方法不存在,通过superclass找到父类
      2> 直至基类仍找不到方法,就会报unrecognized selector sent to instance XXX错误

    • class对象调用类方法的轨迹
      1> class对象的isa指针找到meta-class对象,方法不存在,通过superclass找到父类
      2> 直至基类的meta-class仍找不到方法,会通过基类的meta-class对象的superclass指针找到基类的class对象,如果方法仍不存在,就会报unrecognized selector sent to class XXX错误

    object_getClass()、objc_getClass()、class三者的区别

    • Class object_getClass(id obj)
      1> 传入的obj可能是instance对象、class对象、meta-class对象
      2> 返回值
      a) 如果是instance对象,返回class对象
      b) 如果是class对象,返回meta-class对象
      c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象

    • Class objc_getClass(const char *aClassName)
      1> 传入字符串类名
      2> 返回对应的类对象

    • -(Class)class、+ (Class)class
      1> 返回的就是类对象

    相关文章

      网友评论

          本文标题:OC对象的分类

          本文链接:https://www.haomeiwen.com/subject/sleyoftx.html