对于大多数人来讲,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 实现原理详解(一)相关推荐

  1. 蓝牙:CRC原理详解(附crc16校验代码)

    CRC原理详解(附crc16校验代码) 参考链接: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html Cyclic Redun ...

  2. csrf漏洞防御方案_CSRF 漏洞原理详解及防御方法

    跨站请求伪造:攻击者可以劫持其他用户进行的一些请求,利用用户身份进行恶意操作. 例如:请求http://x.com/del.php?id=1是一个删除ID为1的账号,但是只有管理员才可以操作,如果攻击 ...

  3. AQS抽象队列同步器原理详解

    系列文章目录 第一节 synchronized关键字详解-偏向锁.轻量级锁.偏向锁.重量级锁.自旋.锁粗化.锁消除 AQS抽象队列同步器原理详解 系列文章目录 前言 一.AQS特性 二.AQS原理 1 ...

  4. CRC原理详解(附crc16校验代码)

    CRC原理详解 算法原理 查表法 反向算法 附录1:crc16校验表及用法 算法原理 Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被 ...

  5. JSPatch实现原理详解:让JS调用/替换任意OC方法

    JSPatch实现原理详解:让JS调用/替换任意OC方法 2015-07-10 09:05 编辑: suiling 分类:iOS开发 来源:bang JSPatch以小巧的体积做到了让JS调用/替换任 ...

  6. 卡尔曼滤波工作原理详解

    卡尔曼滤波工作原理详解 网上看到有不少的博客翻译 How a Kalman filter works, in pictures, 这篇文章中非常有趣的解释了卡尔曼滤波,. 但是目前很多翻译的文章中公式 ...

  7. AndroidV1,V2,V3签名原理详解

    AndroidV1,V2,V3签名原理详解 签名校验流程 不同的签名版本之间的区别 V1签名保护机制 V2签名保护机制 V3签名保护机制 怎样判断使用的是哪种签名 参考链接: 签名校验流程 基础知识: ...

  8. Oracle SQL语句执行流程与顺序原理详解

    以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...

  9. 『ML笔记』HOG特征提取原理详解+代码

    HOG特征提取原理详解+代码! 文章目录 一. HOG特征介绍 二. HOG算法具体流程+代码 2.1. 图像灰度化和gamma矫正 2.2. 计算图像像素梯度图 2.3. 在8×8的网格中计算梯度直 ...

最新文章

  1. mysql select * f
  2. 需求调研计划_干货!如何做好一个BI项目的规划和需求定义?
  3. [leetcode-108,109] 将有序数组转换为二叉搜索树
  4. 10.2.5 监视文件.
  5. 折线图设置圆点_Seaborn可视化 折线图seaborn.lineplot
  6. Android开发之使用GridView+仿微信图片上传功能(附源代码)
  7. 我是如何获取新知识的?
  8. Visual Studio Code-GO tasks 设置 (实现在vsc下直接编译输出的功能)
  9. Python自动化运维_批量执行py脚本
  10. MySQL 分区表——《高性能MySQL》
  11. 企业微信批量添加好友
  12. WhatsApp:硅谷屌丝现世逆袭
  13. 2022.03.24【基因组组装】|获取比对到参考基因组的contig序列
  14. wordpress友联_WordPress 友情链接页面终极版
  15. 基于角膜反射的学习心得
  16. 零基础 学 零知识证明
  17. 韦德是梦八“救火队员“
  18. 试题 算法训练 逗志芃的危机
  19. 记一次微信点赞小网站的事故
  20. 神经网络适用于什么问题,神经网络和计算机网络

热门文章

  1. python做直方图-python OpenCV学习笔记实现二维直方图
  2. python编程课程上课有用吗-朋友圈里的编程课,是 Python 还是成功学?
  3. python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解
  4. python 柱状图-【python】【数据分析】3D柱状图就是这么好看
  5. python画图代码彩虹-python绘制彩虹图
  6. python怎么导入视频-python怎么导入数据
  7. pythonapp下载-python编程狮app下载
  8. python怎么读取列表-详解Python如何获取列表(List)的中位数
  9. python哪个版本好-python应该学习哪个版本
  10. python中的散点图代码-绘制python中的线和散点图