iOS底层探索之对象的本质和类的关联特性initIsa(下)
在开始阅读本篇博客之前,建议先去看看我的上一篇博客iOS底层探索之对象的本质和类的关联特性initIsa(上)
本篇内容主要讲下OC
当中类的关联相关的initIsa
1.initIsa结构
从苹果开源的objc
底层源码可以看到OC底层是通过initIsa
和cls
类进行关联的
//关联对象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;
}
代码运行输出结果
我们可以看到共用体
的i
和f
成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也是 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;
}
代码运行结果
从代码运行的结果我们看到,结构体的所有的成员赋值都能正常输出
小结
结构体(struct)中所有变量是“共存”的
- 优点:是海纳百川
“有容乃⼤”
- 缺点:是内存空间的分配是
粗放
的,不管你⽤不⽤,我系统都全给你分配。
- 优点:是海纳百川
联合体(union)中是各变量是
“互斥”
的,有你没我,有我没你- 缺点:就是不够
“包容”
- 优点:是内存使⽤更为
精细灵活
,也节省了内存空间
- 缺点:就是不够
3.位域
上面
iOS底层探索之对象的本质和类的关联特性initIsa(下)相关推荐
- iOS底层探索二(OC 中 alloc 方法 初探)
前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...
- iOS 底层探索篇 —— KVC 底层原理
iOS 底层探索篇 -- KVC 底层原理 1. Method Swizzling的坑与应用 1.1 method-swizzling 是什么? 1.2 坑点 坑点1:method-swizzling ...
- iOS 底层探索 - 消息转发
一.动态方法解析流程分析 我们在上一章<消息查找>分析到了动态方法解析,为了更好的掌握具体的流程,我们接下来直接进行源码追踪. 我们先来到 _class_resolveMethod 方法, ...
- iOS底层探索(二) - 写给小白看的Clang编译过程原理
iOS底层探索(一) - 从零开始认识Clang与LLVM 写在前面 编译器是属于底层知识,在日常开发中少有涉及,但在我的印象中,越接近底层是越需要编程基本功,也是越复杂的.但要想提升技术却始终绕不开 ...
- iOS底层原理总结 - OC对象的本质
苹果官方文档 The Objective-C language defers as many decisions as it can from compile time and link time t ...
- iOS底层原理之KVO本质
面试中常会问道: iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO 什么是KVO 首先需要了解KVO基本使用,KVO的全称 Key-Value Observing, ...
- iOS之深入解析对象isa的底层原理
对象本质 一.NSObject 本质 OC代码的底层实现实质是 C/C++代码 ,继而编译成汇编代码,最终变成机器语言. ① clang C/C++ 编译器 Clang 是⼀个 C 语⾔.C++.Ob ...
- MJiOS底层笔记--OC对象本质
本文属笔记性质,主要针对自己理解不太透彻的地方进行记录. 推荐系统直接学习小码哥iOS底层原理班---MJ老师的课确实不错,强推一波. OC对象本质 基于C与C++结构体实现 OC语言如何被编译器编译 ...
- 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS
iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...
- iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...
iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍 得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...
最新文章
- 春节假期是弯道超车的好机会!
- pycharm 取消连按两下shift出现的全局搜索
- python如何读取数据保存为新格式_python,初学者应用实例:读取文件中的数据,将将北京时间转换成世界时间,再保存成新的CSV格式文件...
- 废旧 Android 手机如何改造成 Linux 服务器?
- 可爱的 CreateMessageDialog
- 元气骑士机器人旁边建筑_元气骑士机器人的一些经验
- rfid考勤系统c语言,基于RFID的员工考勤系统设计
- C语言绘图EasyX图形库基础(笔记)
- n-gram和skip-gram
- python爬取链家二手房信息并存储到数据库
- x64dbgpy 自动化控制插件AIP手册
- 7-9 幂集(回溯法) (20 分)(C语言版)
- 银盒子受邀出席银联云闪付大会,获“最佳行业合作”奖
- 用Python来表白,把情书写进她的照片里
- 计算机兼容,兼容条件
- IE可以上网其他浏览器上不了
- 结构光三维重建-3D Scanning Software实现三维重建
- ORACLE序列的作用
- 提示 you neet to root to perform this command 的解决办法
- 【雕刻机】Grbl程序使用入门