在开始阅读本篇博客之前,建议先去看看我的上一篇博客iOS底层探索之对象的本质和类的关联特性initIsa(上)
本篇内容主要讲下OC当中类的关联相关的initIsa

1.initIsa结构

从苹果开源的objc底层源码可以看到OC底层是通过initIsacls类进行关联的

//关联对象if (!zone && fast) {obj->initInstanceIsa(cls, hasCxxDtor);} else {// Use raw pointer isa on the assumption that they might be// doing something weird with the zone or RR.obj->initIsa(cls);}

command+鼠标左键进入obj->initIsa(cls)

inline void
objc_object::initIsa(Class cls)
{initIsa(cls, false, false);
}

在进入initIsa(cls, false, false)

isa_t

进入isa_t

我们发现isa_t是一个联合体(union),为了能更好的深入的探索下去,我们得先来了解下联合体相关的知识。

2.联合体

我们在C语言中经常看到union,这就是联合体,也叫共用体是一种特殊的数据类型,允许你在相同的内存位置存储不同的数据类型。你可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。

定义联合体

为了定义共用体,必须使用union语句,方式与定义结构类似。union语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:

union [union tag]
{member definition;member definition;...member definition;
} [one or more union variables];

union tag 是可选的,每个member definition是标准的变量定义,比如int i;或者 float f;或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,可以指定一个或多个共用体变量,这是可选的。

联合体举例

下面定义一个名为Data的共用体类型,有三个成员i、f 和 str

union Data
{int i;float f;char  str[20];
};int main( )
{union Data data;        data.i = 10;data.f = 220.5;strcpy( data.str, "C Programming");printf( "data.i : %d\n", data.i);printf( "data.f : %f\n", data.f);printf( "data.str : %s\n", data.str);return 0;
}

代码运行输出结果

我们可以看到共用体if成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也是 str成员能够完好输出的原因。现在让我们再来看一个相同的实例,这次我们在同一时间只使用一个变量,这也演示了使用共用体的主要目的:

   union Data data;        data.i = 10;printf( "data.i : %d\n", data.i);data.f = 220.5;printf( "data.f : %f\n", data.f);strcpy( data.str, "C Programming");printf( "data.str : %s\n", data.str);

代码运行结果

在这里,所有的成员都能完好输出,因为同一时间只用到一个成员。

对比结构体

struct Student{NSString *name;int age;
} Student;int main( )
{struct Student stu;stu.name = @"RENO";stu.age = 18;return 0;
}

代码运行结果

从代码运行的结果我们看到,结构体的所有的成员赋值都能正常输出

小结

  1. 结构体(struct)中所有变量是“共存”的

    • 优点:是海纳百川“有容乃⼤”
    • 缺点:是内存空间的分配是粗放的,不管你⽤不⽤,我系统都全给你分配。
  2. 联合体(union)中是各变量是“互斥”的,有你没我,有我没你

    • 缺点:就是不够“包容”
    • 优点:是内存使⽤更为精细灵活,也节省了内存空间

3.位域

上面

iOS底层探索之对象的本质和类的关联特性initIsa(下)相关推荐

  1. iOS底层探索二(OC 中 alloc 方法 初探)

    前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...

  2. iOS 底层探索篇 —— KVC 底层原理

    iOS 底层探索篇 -- KVC 底层原理 1. Method Swizzling的坑与应用 1.1 method-swizzling 是什么? 1.2 坑点 坑点1:method-swizzling ...

  3. iOS 底层探索 - 消息转发

    一.动态方法解析流程分析 我们在上一章<消息查找>分析到了动态方法解析,为了更好的掌握具体的流程,我们接下来直接进行源码追踪. 我们先来到 _class_resolveMethod 方法, ...

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

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

  5. iOS底层原理总结 - OC对象的本质

    苹果官方文档 The Objective-C language defers as many decisions as it can from compile time and link time t ...

  6. iOS底层原理之KVO本质

    面试中常会问道: iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO 什么是KVO 首先需要了解KVO基本使用,KVO的全称 Key-Value Observing, ...

  7. iOS之深入解析对象isa的底层原理

    对象本质 一.NSObject 本质 OC代码的底层实现实质是 C/C++代码 ,继而编译成汇编代码,最终变成机器语言. ① clang C/C++ 编译器 Clang 是⼀个 C 语⾔.C++.Ob ...

  8. MJiOS底层笔记--OC对象本质

    本文属笔记性质,主要针对自己理解不太透彻的地方进行记录. 推荐系统直接学习小码哥iOS底层原理班---MJ老师的课确实不错,强推一波. OC对象本质 基于C与C++结构体实现 OC语言如何被编译器编译 ...

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

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

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

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

最新文章

  1. 春节假期是弯道超车的好机会!
  2. pycharm 取消连按两下shift出现的全局搜索
  3. python如何读取数据保存为新格式_python,初学者应用实例:读取文件中的数据,将将北京时间转换成世界时间,再保存成新的CSV格式文件...
  4. 废旧 Android 手机如何改造成 Linux 服务器?
  5. 可爱的 CreateMessageDialog
  6. 元气骑士机器人旁边建筑_元气骑士机器人的一些经验
  7. rfid考勤系统c语言,基于RFID的员工考勤系统设计
  8. C语言绘图EasyX图形库基础(笔记)
  9. n-gram和skip-gram
  10. python爬取链家二手房信息并存储到数据库
  11. x64dbgpy 自动化控制插件AIP手册
  12. 7-9 幂集(回溯法) (20 分)(C语言版)
  13. 银盒子受邀出席银联云闪付大会,获“最佳行业合作”奖
  14. 用Python来表白,把情书写进她的照片里
  15. 计算机兼容,兼容条件
  16. IE可以上网其他浏览器上不了
  17. 结构光三维重建-3D Scanning Software实现三维重建
  18. ORACLE序列的作用
  19. 提示 you neet to root to perform this command 的解决办法
  20. 【雕刻机】Grbl程序使用入门

热门文章

  1. python处理select
  2. JavaScript函数的4种调用方法详解
  3. windows安装composer总结
  4. 方法的创建、重载及递归调用
  5. UVa 253 Cube paiting
  6. 软件工程项目需求分析
  7. word20161210
  8. Hark的数据结构与算法练习之地精(侏儒)排序
  9. 关于苹果与摄影的事。
  10. 在Crystal Report 8中调用Oracle的procedure储存过程,并取得返回的类型为Sys_Refcursor数据表...