iOS开发关于block和局部变量和全局变量

block内部引用全局变量和局部变量一直都是一个坑
block与局部变量

- (void)aboutBlock1{__block int index = 100;int (^myBlock)(int addNum) = ^(int addNum){index += addNum;return index;};NSLog(@"在内部修改了局部变量值后 == %d",myBlock(50));//打印结果  在内部修改了局部变量值后 == 150NSLog(@"在内部修改了局部变量值后再打印 == %d",myBlock(50));//打印结果  在内部修改了局部变量值后再打印 == 200index = 50;NSLog(@"在外部修改了局部变量值后 == %d",myBlock(50));//打印结果  在外部修改了局部变量值后 == 100}

用__block修饰了局部变量之后,在block内部和外部都可以对局部变量进行修改。

- (void)aboutBlock2{int block2 = 20;int (^myBlock2)(void) = ^(){return block2;};NSLog(@"局部变量不用__block修饰外部不修改 == %d",myBlock2());//打印结果 局部变量不用__block修饰外部不修改 == 20block2 = 40;NSLog(@"局部变量不用__block修饰外部修改 == %d",myBlock2());//打印结果 局部变量不用__block修饰外部修改 == 20}

如果不用__block修饰block,block内部不可以对局部变量进行修改,否则编译不通过。且在block外部修改变量值,并不影响block捕获的局部变量值,这种情况,block内部的局部变量的值只是block捕获局部变量时的值。如下边代码:

  block2 = 40;NSLog(@"局部变量不用__block修饰外部修改 == %d",myBlock2());//打印结果 局部变量不用__block修饰外部修改 == 20

block捕获block2这个局部变量值时,block2的值为20,所以在调用block之前修改block2的值为40,对block不起作用。

block与全局变量

//全局变量numble初始化赋值70

@interface ViewController ()
@property (nonatomic,  assign) int       numble;@end- (void)aboutBlock3{__weak typeof(self) weakself = self;int (^myBlock3)(int addNum) = ^(int addNum){return weakself.numble + addNum;};NSLog(@"全局变量不用__block修饰外部不修改 == %d",myBlock3(30));//打印结果 全局变量不用__block修饰外部不修改 == 100
}
- (void)aboutBlock4{__weak typeof(self) weakself = self;int (^myBlock4)(int addNum) = ^(int addNum){return weakself.numble + addNum;};self.numble = 170;NSLog(@"全局变量不用__block修饰外部修改 == %d",myBlock4(30));//打印结果 全局变量不用__block修饰外部修改 == 200}

block内部引用局部变量,不使用__block修饰,在block外部改变了局部变量的值,block内部的局部变量只保存了捕获时的值。block内部引用全局变量,在block外部修改了全局变量的值,block捕获的是当前的值。

- (void)aboutBlock6{__weak typeof(self) weakself = self;int (^myBlock6)(int addNum) = ^(int addNum){return weakself.numble += addNum;};NSLog(@"全局变量在block内部被修改 == %d",myBlock6(50));//打印结果 全局变量在block内部被修改 == 220
}

block内部引用局部变量,不用__block修饰,不可以修改局部变量的值,但是block内部引用全局变量,可以在block内部修改全局变量的值。

提示:为了避免循环引用,在block内部应该使用weakself。(__weak typeof(self) weakself = self;)

static修饰全局变量对block的影响

static int block5 = 15;
- (void)aboutBlock5{int (^myBlock5)(int addNum) = ^(int addNum){return block5 + addNum;};NSLog(@"static全局变量在block内部不被修改 == %d",myBlock5(50));//打印结果 static全局变量在block内部不被修改 == 65
}
- (void)aboutBlock7{int (^myBlock7)(int addNum) = ^(int addNum){return block5 += addNum;};myBlock7(70);NSLog(@"static全局变量在block内部被修改 == %d",block5);//打印结果 static全局变量在block内部被修改 == 85}

static定义一个内部变量,在block内部可以修改

- (void)aboutBlock8{int (^myBlock8)(int addNum) = ^(int addNum){return block5 += addNum;};block5 = 35;NSLog(@"全局变量在block内部和外部都被修改(没有调用block) == %d",block5);myBlock8(50);NSLog(@"全局变量在block内部和外部都被修改 == %d",block5);//打印结果 全局变量在block内部和外部都被修改(没有调用block) == 35 全局变量在block内部和外部都被修改 == 85
}

block内部static修饰局部变量

- (void)aboutBlock9{static int block9 = 40;int (^myBlock9)(int addNum) = ^(int addNum){return block9 += addNum;};myBlock9(30);NSLog(@"static修饰局部变量,block内部修改 == %d",block9);//打印结果 static修饰局部变量,block内部修改 == 70
}

static修饰了局部变量,延长了局部变量的生命周期,在block内部也是可以对局部变量进行修改的

- (void)aboutBlock10{static int block10 = 40;int (^myBlock10)(int addNum) = ^(int addNum){return block10 += addNum;};block10 = 80;NSLog(@"static修饰局部变量,block外部修改 == %d",myBlock10(30));//打印结果 static修饰局部变量,block外部修改 == 110
}

在block外部修改static修饰的局部变量,发现也是能够修改的。

iOS开发关于block和局部变量和全局变量相关推荐

  1. iOS开发关于block学习的总结

    一,什么是blocks Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二,什么情况下 ...

  2. 浅析ios开发中Block块语法的妙用

    事实上,任何一个应用的开发都离不开多线程.而"块"block与GCD就是苹果OC语言中多线程的核心.      一.块的内部结构      在oc中,块语法以闭包的形式存在,每一个 ...

  3. IOS开发基础之OC的Block入门_Day09-Block

    IOS开发基础之OC的Block入门_Day09-Block block是oc的重要的基础知识,重点之重.跟协议一样重要,是进行函数回调重要手段.在后续的UI学习具有举足轻重的地位.学会基础的bloc ...

  4. iOS开发-由浅至深学习block

    作者:Sindri的小巢(简书) 关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们 ...

  5. iOS开发 - OC - block的详解 - 深入篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

  6. iOS开发笔记(二):block循环引用

    写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...

  7. iOS开发学习48 OC的lambda block

    iOS开发学习48 lambda表达式 一.block 简介 二.block使用 1. block的写法大概就是这样: 2. 带参数的话可以这样写: 3. 如果不写入参,可以写: 4. 当然返回也可以 ...

  8. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

  9. iOS开发-面试总结(九)

    iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...

最新文章

  1. Python文件打包成exe
  2. 面试:从volatile说到i++的线程安全问题
  3. 外包网络推广公司浅析想保持稳定的SEO排名和流量,需要做什么呢?
  4. Docker管理面板Portainer中文汉化教程
  5. android 百度地图 在线建议查询,Android 百度地图 SDK v3_3_0 (五) ---POI搜索和在线建议查询功能...
  6. 报任安书文言现象_语文老师精心总结【文言文常考点】够你从初一用到初四!...
  7. ICMP (互联网控制消息协议 )是什么
  8. Python 爬虫性能相关总结
  9. php权限在哪设置,php如何设置管理员权限
  10. Ubuntu 16.04 LTS 下Nginx的编译安装与启动
  11. Mean-shift超像素分割
  12. Java三大主流框架
  13. Data Center TCP (DCTCP)学习笔记
  14. 看完淘宝技术这十年思考
  15. ADAS倒车雷达超声波传感器elmos524.03驱动
  16. 《C++程序设计》课程设计报告
  17. CryEngine5 Shader调试
  18. openpose vs2015 cuda8.0 cudnn5.0 TiTan xp 环境配置
  19. HTML做一个圣诞页面(纯html代码)
  20. Oracle数据库实例之进程架构(二)

热门文章

  1. 15篇大数据精品文章大合集
  2. 搭建or部署接口自动化平台从零到一的过程
  3. 地图下载白嫖神器!你该怎么用好它
  4. 直播APP开发:直播源码流媒体技术介绍!
  5. 详解randn函数及 randn('state')
  6. Python学习笔记——字典
  7. 计算机组装师分为哪几步,电脑组装主要需要学习哪几个方面?难学吗?
  8. 【BYM】Android 实现相机快门动画
  9. 盘点国内好用的企业网盘
  10. 【狂神说Java】---JavaWeb