ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OC对象的三种分类

2020-12-09 21:31:26  阅读:219  来源: 互联网

标签:const 对象 分类 OC 三种 isa ro class 指针


object-c中的对象主要分为3种:

  • instance对象(实例对象)
  • class对象(类对象)
  • meta-class对象(元类对象)

instance对象

  • instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
  • 内存中存储着:
  • isa指针
  • 其他成员变量

class对象

  • 每个类对象在内存中有且只有一个class对象

  • 内存中存储着:

  • isa指针

  • superclass指针

  • 类的属性信息(@property)、类的对象方法信息(instance > * method)

  • 类的协议信息(protocol)、类的成员变量信息(ivar)

  • 其他成员变量

meta-class对象

  • 即类对象的isa所指向的对象,每个类在内存中有且只有一个meta-class对象

  • meta-class对象和class对象的内存结构是一样的,但是用途不一样

  • 通过 object_getclass可获取到元类对象

  • 内存中存储着:

  • isa指针

  • superclass指针

  • 类的属性信息(@property)、类的对象方法信息(instance > * method)

  • 类的协议信息(protocol)、类的成员变量信息(ivar)

  • 其他成员变量

三种对象的isa和superclass指针之间的关系

  • isa指针
  • class对象的superclass指针
  • meta-class对象的superclass指针

    总 结 总结 总结

class结构

从底层来看,class和meta-class都是objc_class结构

struct objc_class  {
    Class ISA;
    Class superclass;
    cache_t cache;             // 方法缓存
    class_data_bits_t bits;    // 类的具体信息,想要&FAST_DATA_MASK才能获取到正确的地址
    ...
};

class_data_bits_t结构大体:

struct class_data_bits_t {
    class_rw_t* data; //存储类的信息
    ...
}

class_rw_t大体结构:

struct class_rw_t { 
    uint32_t flags;
    uint16_t witness;
    explicit_atomic<uintptr_t> ro_or_rw_ext;
    Class firstSubclass;
    Class nextSiblingClass;
    using ro_or_rw_ext_t = objc::PointerUnion<const class_ro_t *, class_rw_ext_t *>;
    const ro_or_rw_ext_t get_ro_or_rwe();
    const class_ro_t *ro();
    const method_array_t methods();         //方法列表
    const property_array_t properties();    //属性列表
    const protocol_array_t protocols();     //协议列表
    ...
};

其中ro结构体为:

struct class_ro_t {
    uint32_t flags;
    uint32_t instanceStart;
    uint32_t instanceSize;			 //实例创建出来的占用的空间大小
#ifdef __LP64__
    uint32_t reserved;
#endif
    const uint8_t * ivarLayout;
    const char * name;                //类名
    method_list_t * baseMethodList;
    protocol_list_t * baseProtocols;
    const ivar_list_t * ivars;
    const uint8_t * weakIvarLayout;
    property_list_t *baseProperties;
    ...
};

小细节:define ISA_MASK 0x0000000ffffffff8ULL可以发现isa指向的类或者元类对象的地址,最后三位都是0

原 文 链 接 : h t t p s : / / j u e j i n . c n / p o s t / 6895921854821695496 原文链接:https://juejin.cn/post/6895921854821695496 原文链接:https://juejin.cn/post/6895921854821695496

标签:const,对象,分类,OC,三种,isa,ro,class,指针
来源: https://blog.csdn.net/qq_45765503/article/details/110940999

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有