• 事实上我感觉不常常使用block的朋友。对block应该是比較陌生的,那么如今我们来扒开block的真面目,看看block的本质

普通的局部变量。block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变

void test()
{int age = 10;void (^block)() = ^{// 普通的局部变量,block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变NSLog(@"----age=%d", age);};age = 20;block();
}

这里的结果是10;事实上在编译的时候,是相当于这种:

void test2()
{int age = 10;void (^block)() = ^{// 普通的局部变量,block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变NSLog(@"----age=%d", 10);};age = 20;block();
}

这里的这个值 是死的。

所以不管你后面把age改成多少。block都不关心。换句话说:这里的age是局部变量,出了大括号就死了。所以直接把这个10拿过来,比較安全


我们看一下。被block引用的变量的情况:
block内部可以一直引用被__block修饰的变量

void test3()
{__block int age = 10;void (^block)() = ^{// block内部可以一直引用被__block修饰的变量NSLog(@"----age=%d", age);};age = 20;block();
}

这里:block能一直监听着这个age的值的改变(不管是局部变量还是全局变量),所以这里打印出来的是age是20
__block修饰的变量,就能保住这个变量的命


这里我们来看一下。被static修饰的变量。是静态变量,静态是永远在内存中。所以block看到static修饰的这个变量是永远存在内存中的。那么block就能每次都能拿到这个变量,所以你age的值的改变。block都能拿到。所以这是动态訪问的,不是把10直接拿过来

void test4()
{static int age = 10;void (^block)() = ^{// block内部可以一直引用被static修饰的变量NSLog(@"----age=%d", age);};age = 20;block();
}

int num = 10;
void test5()
{void (^block)() = ^{// block内部可以一直引用全局变量NSLog(@"----num=%d", num);};num = 20;block();
}

这里打印出来的num 是20 。

为什么呢?
由于这里的num是全局变量。那么既然是全局变量,就一直在内存中,block就能实时跟新这个值的改变。


总结,那么我们如今推断的时候,我们仅仅须要推断这个变量是不是立即就销毁了即可了。可是注意一下__block修饰的变量即可

转载于:https://www.cnblogs.com/gavanwanggw/p/6977753.html

经验之谈—让你看明确block相关推荐

  1. FPGA block RAM和distributed RAM区别(以及xilinx 7系列CLB资源)

    原地地址:FPGA block RAM和distributed RAM区别 区别之1 block ram 的输出需要时钟,distributed ram在给出地址后既可输出数据. 区别之2 distr ...

  2. (0032) iOS 开发之Block 的基础用法及注意事项1

    该文章参考多篇文章,已记不清,如有问题请联系我. 参考:http://blog.csdn.net/zm_yh/article/details/51469275 Block理解 1. Block执行的代 ...

  3. ObjC block入门

    objC的block是基于c语言开发,可以在c,c++和objc中使用. 声明和使用一个block: block中会用到一个特殊的操作符^.整个block体都放在{}中. 例如: 1 int mult ...

  4. iOS之Block总结以及内存管理

    block定义 struct Block_descriptor {unsigned long int reserved;unsigned long int size;void (*copy)(void ...

  5. iOS探索:Block解析浅谈

    什么是Block Block是将函数及其执行上下文封装起来的对象 接下来让我们通过源码来看一看Block的本质 我们在一个方法中写了三行代码,第一行是定义了一个局部变量,第二行是一个Block,第三行 ...

  6. 有趣 IOS 开展 - block 使用具体解释

    Block 它是iOS于4.0新的程序语法之后,于iOS SDK 4.0之后,block应用几乎无处不在. 在其他语言中也有类似的概念,称为闭包(closure),实例object C兄弟swift ...

  7. ios Block底层详解、框架结构:捕获、对象类型、__block、__forwarding、循环引用

    1:捕获 2:block类型 2.1:问题 :mrc环境下  下面讲的都是mrc环境下,会真实很多 2.2:在arc下,block 自动加上copy的情况---:返回block. 2.3:在arc下, ...

  8. 浅谈OC中Block的本质

    Block简介 block是将函数及其执行上下文封装起来的一个对象 在block实现的内部,有很多变量,因为block也是一个对象 其中包含了诸如isa指针,imp指针等对象变量,还有储存其截获变量的 ...

  9. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

最新文章

  1. java treeset 删除_删除Java TreeSet中的最高元素
  2. IIS日志自动删除程序 收藏
  3. find指定具体时间参数-newermt
  4. Python中的split,rsplit,splitlines
  5. java多线程间的通信传值_Java 多线程之间的通信
  6. C# 中对象与JSON字符串相互转换的三种方法
  7. 【STC15库函数上手笔记】9、硬件SPI
  8. Android官方开发文档Training系列课程中文版:创建自定义View之View的优化
  9. linux 下wine 和plyaonlinux 安装以及卸载 (linux下运行windows软件的神器)
  10. 自定义View/ViewGroup的步骤和实现
  11. 登录注册页面(连接MySQL8.0.15版本)
  12. vim字符串全局替换
  13. JMP入门官方文档---发现JMP.pdf---中文版
  14. Android基本UI控件(一)
  15. neu计算机硕士,BC省可直接移民的硕士专业-NEU-Align计算机硕士
  16. Linux回炉学习(一)
  17. 虚拟机CentOS无网络连接
  18. 中兴视讯服务器 广州,中兴通讯推出全新高清视讯解决方案
  19. 张勋说:简述棒磨机的工作运行原理和磨损机制(图文)
  20. cad vba 打开文件对话框_AutoCAD VBA选择文件夹的代码

热门文章

  1. 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)
  2. linux 2.6内核进程调度,Linux2.4与Linux2.6内核调度器的比较研究
  3. 属性数量限制android,Android开发笔记 今天学到的一些属性
  4. 公司服务器文档管理制度,文件服务器管理制度
  5. VB怎样屏蔽 Alt+F4键
  6. 2019ASC世界大学生超算竞赛预赛结果出炉:20校晋级,北航第一
  7. 北大主场夺金ACM-ICPC全球总决赛,总教练罗国杰分享背后“秘笈”
  8. 百度黑莓宣布联手搞自动驾驶,QNX系统成Apollo平台基础
  9. 阿里AI实验室负责人浅雪:从不淘宝购物的马云是天猫精灵用户
  10. 业界分享 | 数据科学家工作融入及面试技巧