经验之谈—让你看明确block
- 事实上我感觉不常常使用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修饰的变量即可
经验之谈—让你看明确block的更多相关文章
- Objective-C中的Block(闭包)
学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也 ...
- iOS-重回block小白之路
在我刚刚接触iOS开发的时候,是通过MJ老师讲的OC基础入门的,iOS圈的人应该基本都知道MJ大神吧,即便如此大神,讲解完block之后我依然感觉晕晕乎乎的,直到后来真正进公司做项目,依然感觉这是自己 ...
- iOS Block 内存管理的探讨
在很多情况下Block是造成程序循环引用内存泄漏的元凶.下面我们就讲解一下block对内存管理的影响.在讲解之前.希望大家对block有一定的了解.如果大家还不是太清楚block的实现原理.希望大家可 ...
- iOS开发Block的使用
Block 是从 iOS4引入的,在日常开发中,会经常用到Block.特别是在多线程中,Block的用处更广泛.而且,Block不仅可以接收参数,其本身也可以作为参数,因此,Block的功能非常强大. ...
- Objective-C中的Block(闭包) (轉載)
来源: 伯乐在线 - 青玉伏案 链接:http://ios.jobbole.com/83229/ 学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过 ...
- block没那么难(二):block和变量的内存管理
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...
- block没那么难(一):block的实现
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...
- 有趣 IOS 开展 - block 使用具体解释
Block 它是iOS于4.0新的程序语法之后,于iOS SDK 4.0之后,block应用几乎无处不在. 在其他语言中也有类似的概念,称为闭包(closure),实例object C兄弟swift ...
- 关于 Block 中捕获 self 的分析
问题 最近遇到一个已经使用了weak-strong dance的block依旧强引用了self的情况,好在block没被VC持有只是延迟释放,但这里的关键是用了weak_self的blcok理应不会强 ...
随机推荐
- eclipse maven install 时控制台乱码问题解决
pom.xml文件中加入: <properties> <argLine>-Dfile.encoding=UTF-8</argLine> <project.bu ...
- Win7下JDK环境变量设置批处理(转)
每次重装系统之后,都需要重新设置JDK环境变量 项目中有些入门小白看了网络上的设置环境变量的文章还是会设置错环境变量 提供一个批处理能够在Win7下运行(使用了setx命令),自动设置环境变量. cl ...
- Chrome无界面浏览模式与自定义插件加载问题
环境:Python 3.5.x + Selenium 3.4.3 + Chromedriver 2.30 + Chrome 60 beta或Chromium Canary 61 + WIN10 Chr ...
- cxf 实例解读
1.sample 实例之一---java_first_pojo 服务端发布服务的方法: 1 HelloWorldImpl helloworldImpl = new HelloWorldImpl(); ...
- ArcGIS api for javascript——显示一个信息窗口
描述 这个示例展示了在用户单击地图时如何在InfoWindow中显示信息.信息窗口是一个dijit (Dojo widget).信息窗口能够包含文本,字符,图片和任何通过HTML表示的事物.这个例子在 ...
- swift 笔记 (十一) —— 方法(类,结构体,枚举)
Methods (方法) 实例方法(Instance Methods) 我认为看到这里.我们唯能八一八的就是swift的自做主张的行为了,反正它就是会以各种方式帮助我们来完毕让代码看起来非常奇怪的事情 ...
- android YUV Sensor配置Camera应用的flash auto菜单
请在Config.ftbl.flashlight.h (mediatek\custom\common\hal\flashlight\src)中. 将全部的两处凝视掉的code: //CameraPar ...
- _DataStructure_C_Impl:LinkListBasedSort
#include<stdio.h> #include<stdlib.h> #include"LinkList.h" //创建单链表 void CreateL ...
- js插件---强大的图片裁剪Cropper
js插件---强大的图片裁剪Cropper 一.总结 一句话总结:官网或者github里面的文档或者demo才是真的详细 使用的话找到图片裁剪后的base64数据,然后这个数据可下载可传递到服务器 1 ...
- Android ViewPager实现多个图片水平滚动
1.示意图 2.实现分析 (1).xml配置 <!-- 配置container和pager的clipChildren=false, 并且指定margi ...