block 实现原理详解(一)
对于大多数人来讲,block内部到底是怎样实现的呢?我们可以借助clang将其编译成为c++的代码,就可以看出,block到底是什么东西,
先来看这样一个问题,
<!-- lang: cpp -->int age = 10;void (^block)() = ^{NSLog(@"%d",age); }; age = 30; block();//10
以及下面的这一段代码
<!-- lang: cpp -->__block int age = 10;void (^block)() = ^{NSLog(@"%d",age); }; age = 30; block();//30
你会发现这两个结果是不同的,
第一个输出10,第二个输出的是30
要想知道这里面干了些什么!需要我们将其编译成为C++代码,看下里面到底搞了些什么?
使用终端,转到mian.m文件下,使用如下代码 clang -rewrite-objc main.m 将其编译生成 main.cpp文件
这时候,我们打开mian.cpp便知 在文件的最底下main函数中
<!-- lang: cpp -->
int main(int argc, const char * argv[])
{
/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; __attribute__((__blocks__(byref))) __Block_byref_age_0 age = {(void*)0,(__Block_byref_age_0 *)&age, 0, sizeof(__Block_byref_age_0), 10}; void (*block)() = (void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, (__Block_byref_age_0 *)&age, 570425344); (age.__forwarding->age) = 30; ((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block); } return 0;
}
block内部是调用了一个结构体中的函数:
static struct main_block_desc_0 {
size_t reserved;
size_t Block_size;
void (copy)(struct __main_block_impl_0, struct main_block_impl_0);
void (dispose)(struct __main_block_impl_0*);
}
然后经过分析该c++文件我们知道
block实际上是: 指向结构体的指针
编译器会将block的内部代码生成对应的函数
而在mian.m中,调用普通的int变量时,传过来的age其实是一个值传递,而__block则是引用传递!
所以,才是如上的结果!
转载于:https://www.cnblogs.com/yinxiao-bai1014/p/5039687.html
block 实现原理详解(一)相关推荐
- 蓝牙:CRC原理详解(附crc16校验代码)
CRC原理详解(附crc16校验代码) 参考链接: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html Cyclic Redun ...
- csrf漏洞防御方案_CSRF 漏洞原理详解及防御方法
跨站请求伪造:攻击者可以劫持其他用户进行的一些请求,利用用户身份进行恶意操作. 例如:请求http://x.com/del.php?id=1是一个删除ID为1的账号,但是只有管理员才可以操作,如果攻击 ...
- AQS抽象队列同步器原理详解
系列文章目录 第一节 synchronized关键字详解-偏向锁.轻量级锁.偏向锁.重量级锁.自旋.锁粗化.锁消除 AQS抽象队列同步器原理详解 系列文章目录 前言 一.AQS特性 二.AQS原理 1 ...
- CRC原理详解(附crc16校验代码)
CRC原理详解 算法原理 查表法 反向算法 附录1:crc16校验表及用法 算法原理 Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被 ...
- JSPatch实现原理详解:让JS调用/替换任意OC方法
JSPatch实现原理详解:让JS调用/替换任意OC方法 2015-07-10 09:05 编辑: suiling 分类:iOS开发 来源:bang JSPatch以小巧的体积做到了让JS调用/替换任 ...
- 卡尔曼滤波工作原理详解
卡尔曼滤波工作原理详解 网上看到有不少的博客翻译 How a Kalman filter works, in pictures, 这篇文章中非常有趣的解释了卡尔曼滤波,. 但是目前很多翻译的文章中公式 ...
- AndroidV1,V2,V3签名原理详解
AndroidV1,V2,V3签名原理详解 签名校验流程 不同的签名版本之间的区别 V1签名保护机制 V2签名保护机制 V3签名保护机制 怎样判断使用的是哪种签名 参考链接: 签名校验流程 基础知识: ...
- Oracle SQL语句执行流程与顺序原理详解
以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...
- 『ML笔记』HOG特征提取原理详解+代码
HOG特征提取原理详解+代码! 文章目录 一. HOG特征介绍 二. HOG算法具体流程+代码 2.1. 图像灰度化和gamma矫正 2.2. 计算图像像素梯度图 2.3. 在8×8的网格中计算梯度直 ...
最新文章
- mysql select * f
- 需求调研计划_干货!如何做好一个BI项目的规划和需求定义?
- [leetcode-108,109] 将有序数组转换为二叉搜索树
- 10.2.5 监视文件.
- 折线图设置圆点_Seaborn可视化 折线图seaborn.lineplot
- Android开发之使用GridView+仿微信图片上传功能(附源代码)
- 我是如何获取新知识的?
- Visual Studio Code-GO tasks 设置 (实现在vsc下直接编译输出的功能)
- Python自动化运维_批量执行py脚本
- MySQL 分区表——《高性能MySQL》
- 企业微信批量添加好友
- WhatsApp:硅谷屌丝现世逆袭
- 2022.03.24【基因组组装】|获取比对到参考基因组的contig序列
- wordpress友联_WordPress 友情链接页面终极版
- 基于角膜反射的学习心得
- 零基础 学 零知识证明
- 韦德是梦八“救火队员“
- 试题 算法训练 逗志芃的危机
- 记一次微信点赞小网站的事故
- 神经网络适用于什么问题,神经网络和计算机网络
热门文章
- python做直方图-python OpenCV学习笔记实现二维直方图
- python编程课程上课有用吗-朋友圈里的编程课,是 Python 还是成功学?
- python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解
- python 柱状图-【python】【数据分析】3D柱状图就是这么好看
- python画图代码彩虹-python绘制彩虹图
- python怎么导入视频-python怎么导入数据
- pythonapp下载-python编程狮app下载
- python怎么读取列表-详解Python如何获取列表(List)的中位数
- python哪个版本好-python应该学习哪个版本
- python中的散点图代码-绘制python中的线和散点图