一、类的数据结构

Class(指针)

typedef struct objc_class *Class;/*这是由编译器为每个类产生的数据结构,这个结构定义了一个类.这个结构是通过编译器在执行时产生,在运行时发送消息时使用.因此,一些成员改变了类型.编译器产生"char* const"类型的字符串指针替代了下面的成员变量"super_class"
*/
struct objc_class { struct objc_class* class_pointer; /* 指向元类的指针. */ struct objc_class* super_class; /* 指向父类的指针. 对于NSObject来说是NULL.*/ const char* name; /* 类的名称. */ long version; /* 未知. */ unsigned long info; /* 比特蒙板. 参考下面类的蒙板定义. */ long instance_size; /* 类的字节数.包含类的定义和所有父类的定义 */ #ifdef _WIN64 long pad; #endif struct objc_ivar_list* ivars; /* 指向类中定义的实例变量的列表结构. NULL代表没有实例变量.不包括父类的变量. */ struct objc_method_list* methods; /* 链接类中定义的实例方法. */ struct sarray * dtable; /* 指向实例方法分配表. */ struct objc_class* subclass_list; /* 父类列表 */ struct objc_class* sibling_class; struct objc_protocol_list *protocols; /* 要实现的原型列表 */ void* gc_object_type; };

Method(指针)

typedef struct objc_method *Method;/* 编译器依据类中定义的方法为该类产生一个或更多这种这种结构.一个类的实现可以分散在一个文件中不同部分,同时类别可以分散在不同的模块中.为了处理这个问题,使用一个单独的方法链表 */
struct objc_method
{SEL         method_name;  /* 这个变量就是方法的名称.编译器使用在这里使用一个`char*`,当一个方法被注册,名称在运行时被使用真正的SEL替代 */ const char* method_types; /* 描述方法的参数列表. 在运行时注册选择器时使用.那时候方法名就会包含方法的参数列表.*/ IMP method_imp; /* 方法执行时候的地址. */ };

Ivar(指针)

typedef struct objc_ivar *Ivar;/* 编译器依据类中定义的实例变量为该类产生一个或更多这种这种结构  */
struct objc_ivar
{const char* ivar_name; /* 类中定义的变量名. */ const char* ivar_type; /* 描述变量的类型.调试时非常有用. */ int ivar_offset; /* 实例结构的基地址偏移字节 */ };

Category(指针)

typedef struct objc_category *Category;/* 编译器为每个类别产生一个这样的结构.一个类可以具有多个类别同时既包括实例方法,也可以包括类方法*/
struct objc_category
{const char* category_name; /* 类别名.定义在类别后面的括号内*/ const char* class_name; /* 类名 */ struct objc_method_list *instance_methods; /* 链接类中定义的实例方法. NULL表示没有实例方法. */ struct objc_method_list *class_methods; /* 链接类中定义的类方法. NULL表示没有类方法. */ struct objc_protocol_list *protocols; /* 遵循的协议表 */ };

objc_property_t

typedef struct objc_property *objc_property_t;

IMP

id (*IMP)(id, SEL, ...)

SEL

typedef struct objc_selector *SEL;struct objc_selector
{void *sel_id;const char *sel_types; };

objc_method_list

struct objc_method_list
{struct objc_method_list*  method_next; /* 这个变量用来链接另一个单独的方法链表 */int method_count; /* 结构中定义的方法数量 */ struct objc_method method_list[1]; /* 可变长度的结构 */ };

objc_cache

struct objc_cache
{unsigned int mask;unsigned int occupied; Method buckets[1]; };

objc_protocol_list

struct objc_protocol_list
{struct objc_protocol_list *next;size_t count;struct objc_protocol *list[1]; };

二、实例的数据结构

id

typedef struct objc_object *id;

objc_object

struct objc_object
{// 类的指针是对象相关的类.如果是一个类对象, 这个指针指向元类.Class isa; };

objc_super

struct objc_super
{id    self;        /* 消息的接受者  */Class super_class; /* 接受者的父类 */ };

转载于:https://www.cnblogs.com/wanghuaijun/p/5230160.html

IOS底层数据结构--class相关推荐

  1. iOS底层探索(二) - 写给小白看的Clang编译过程原理

    iOS底层探索(一) - 从零开始认识Clang与LLVM 写在前面 编译器是属于底层知识,在日常开发中少有涉及,但在我的印象中,越接近底层是越需要编程基本功,也是越复杂的.但要想提升技术却始终绕不开 ...

  2. iOS底层原理之内存管理

    文章目录 定时器 CADisplayLink.NSTimer GCD定时器 内存管理 iOS程序的内存布局 Tagged Pointer OC对象的内存管理 拷贝 引用计数的存储 dealloc 自动 ...

  3. iOS底层开发消息发送与转发流程

    iOS底层开发消息转发流程 一,cache缓存读取流程分析 首先我们上一章已经了解到对应的cache_t的数据结构 _bucketsAndMaybeMask:指针类型,存放buckets的首地址 _m ...

  4. 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...

  5. ios底层核心模板结构 - list_array_tt entsize_list_tt

    探索objc底层原理过程中,经常会碰到一个模板 list_array_tt 你在类加载,方法查找,散列表,同步锁等等都会碰到这个结构,c++的模板功能十分强大,但代码看上去确实比较头疼 其实没那么糟了 ...

  6. iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍         得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...

  7. iOS底层原理 - 常驻线程

    iOS底层原理 - 常驻线程 在 AFN 2.0 时代,会经常看到 AFN 创建一个常驻线程的方式: 0️⃣ AFN 2.0 时代的常驻线程 + (NSThread *)networkRequestT ...

  8. Redis 概念以及底层数据结构

    Redis 简介 REmote DIctionary Server(Redis) 是一个由SalvatoreSanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C ...

  9. 四、redis的底层数据结构

    1.演示数据类型的实现 上篇博客我们在介绍 key 相关命令的时候,介绍了如下命令: OBJECT ENCODING key 该命令是用来显示那五大数据类型的底层数据结构. 比如对于 string 数 ...

最新文章

  1. 入职体检体检错了_我们如何更新入职体验并获得更多用户
  2. python输出print(x+y)_Python语句序列“x='car';y=2; print(x+y)”的输出结果是_学小易找答案...
  3. led灯bin值_「技术贴」如何判断LED透明屏正发光与侧发光的优劣?
  4. 一分钟学会看k线图_看K线图:阴跌如钝刀
  5. Android 插件化原理解析——Activity生命周期管理
  6. MySQL绿色版5.7以上安装教程
  7. 网络数据包收发流程(四):协议栈之packet_type
  8. Opencv--resize函数五种插值算法实现
  9. Android API level 版本对应关系
  10. knn算法python代码_在python中使用KNN算法处理缺失的数据
  11. 004 Spark中的local模式的配置以及测试
  12. Bailian3195 最大公约数【数论】
  13. python不同颜色散点图_Python+matplotlib绘制不同大小和颜色散点图实例
  14. Python 判断素数(质数)的方法讲解
  15. 曾经,我以为我很懂 MySQL 索引...
  16. 迪斯尼计算机动画,迪斯尼经典动画的十大运动规律
  17. Google Earth Engine(GEE)合成长时序的月NDVI与LST
  18. 电信号码呼叫转移设置和取消
  19. web中gzip,deflate的压缩与解压
  20. Linux命令——bash

热门文章

  1. python编辑svg文件_如何修改pygal生成的svg文件背景色
  2. aix安装bff_##aix5.3升级到高版本后,安装低BFF文件的问题
  3. java不带括号_java – 打印数组,不带括号和逗号
  4. mysql+数据库主从原理_MySQL主从复制原理及实现
  5. python 开关_Python开关盒
  6. zk可实现分布式锁,Redis也可实现,之间有什么区别?
  7. 开课吧:Java软件开发的优点有哪些?​
  8. C++基础教程之数据结构
  9. 开课吧Java课堂:什么是ArrayList类
  10. ECMAScript6(17):Class类