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

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

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

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

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

这里的这个值 是死的。

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


我们看一下。被block引用的变量的情况:

block内部可以一直引用被__block修饰的变量

  1. void test3()
  2. {
  3. __block int age = 10;
  4. void (^block)() = ^{
  5. // block内部可以一直引用被__block修饰的变量
  6. NSLog(@"----age=%d", age);
  7. };
  8. age = 20;
  9. block();
  10. }

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

__block修饰的变量,就能保住这个变量的命


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

  1. void test4()
  2. {
  3. static int age = 10;
  4. void (^block)() = ^{
  5. // block内部可以一直引用被static修饰的变量
  6. NSLog(@"----age=%d", age);
  7. };
  8. age = 20;
  9. block();
  10. }

  1. int num = 10;
  2. void test5()
  3. {
  4. void (^block)() = ^{
  5. // block内部可以一直引用全局变量
  6. NSLog(@"----num=%d", num);
  7. };
  8. num = 20;
  9. block();
  10. }

这里打印出来的num 是20 。

为什么呢?

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


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

经验之谈—让你看明确block的更多相关文章

  1. Objective-C中的Block(闭包)

    学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也 ...

  2. iOS-重回block小白之路

    在我刚刚接触iOS开发的时候,是通过MJ老师讲的OC基础入门的,iOS圈的人应该基本都知道MJ大神吧,即便如此大神,讲解完block之后我依然感觉晕晕乎乎的,直到后来真正进公司做项目,依然感觉这是自己 ...

  3. iOS Block 内存管理的探讨

    在很多情况下Block是造成程序循环引用内存泄漏的元凶.下面我们就讲解一下block对内存管理的影响.在讲解之前.希望大家对block有一定的了解.如果大家还不是太清楚block的实现原理.希望大家可 ...

  4. iOS开发Block的使用

    Block 是从 iOS4引入的,在日常开发中,会经常用到Block.特别是在多线程中,Block的用处更广泛.而且,Block不仅可以接收参数,其本身也可以作为参数,因此,Block的功能非常强大. ...

  5. Objective-C中的Block(闭包) (轉載)

    来源: 伯乐在线 - 青玉伏案 链接:http://ios.jobbole.com/83229/ 学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过 ...

  6. block没那么难(二):block和变量的内存管理

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...

  7. block没那么难(一):block的实现

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...

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

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

  9. 关于 Block 中捕获 self 的分析

    问题 最近遇到一个已经使用了weak-strong dance的block依旧强引用了self的情况,好在block没被VC持有只是延迟释放,但这里的关键是用了weak_self的blcok理应不会强 ...

随机推荐

  1. PostgreSQL指定用户可访问的数据库pg_hba.conf

    进入指定目录: # cd /var/lib/pgsql/9.3/data/ 使用vi编辑pg_hba.conf文件 # vi pg_hba.conf 以上配置为所有IP及网关都允许访问,使用MD5认证 ...

  2. hbase启动报错

    前一段时间vmware上的ubuntu的hbase用不了了,而hadoop能正常的操作,非常的奇怪. 错误信息好像是connect fail, RPC什么的,看来跟网路有关. 想起以前曾经解决过hba ...

  3. KNN分类器

    KNN学习(K-Nearest Neighbor algorithm,K最邻近方法 )是一种统计分类器,对数据的特征变量的筛选尤其有效. 基本原理 KNN的基本思想是:输入没有标签(标注数据的类别), ...

  4. poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)

    题目:http://poj.org/problem?id=3261 仍然是后缀数组的典型应用----后缀数组+lcp+二分 做的蛮顺的,1A 可是大部分时间是在调试代码.由于模板的全局变量用混了,而自 ...

  5. BZOJ 1193 搜索+贪心

    预处理出100*100以内的最优解 贪心走日 判断是0*4还是2*4 搞定 //By SiriusRen #include <queue> #include <cstdio> ...

  6. 简单的字符串压缩--C代码

    #include <stdio.h> #include <string.h> bool compress(char *str) { char *p=str,c; ; if(!s ...

  7. 分享js中 pageY = clientY + document.body.scrollTop 之间的关系

    //这里没有考虑兼容ie模式下 兼容一般主流浏览器 var $1 = document.getElementById('main') $1.onclick = function(e){ console ...

  8. 分享vue ui时间组件用法

    //js code var jiaban = { template:` <i-form v-ref:form_jb :model="form_jb" :rules=" ...

  9. Linux PuTTY 更改字体

    Linux PuTTY默认的字体比较小看着比较不舒服,Linux PuTTY的字体更改与Windows下的设置有所不同 1.Linux PuTTY默认的字体 ,Font used for ordina ...

  10. 修改mysql 的 字符集 解决中文乱码问题

    确定的是自己mysql的字符集是否都是utf8, 通过mysql -u root -p然后输入数据库的密码登陆. 在mysql命令行查询自己的字符集是否都是utf8(除了文件的编码是binary). ...