iOS开发关于block和局部变量和全局变量
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和局部变量和全局变量相关推荐
- iOS开发关于block学习的总结
一,什么是blocks Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二,什么情况下 ...
- 浅析ios开发中Block块语法的妙用
事实上,任何一个应用的开发都离不开多线程.而"块"block与GCD就是苹果OC语言中多线程的核心. 一.块的内部结构 在oc中,块语法以闭包的形式存在,每一个 ...
- IOS开发基础之OC的Block入门_Day09-Block
IOS开发基础之OC的Block入门_Day09-Block block是oc的重要的基础知识,重点之重.跟协议一样重要,是进行函数回调重要手段.在后续的UI学习具有举足轻重的地位.学会基础的bloc ...
- iOS开发-由浅至深学习block
作者:Sindri的小巢(简书) 关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们 ...
- iOS开发 - OC - block的详解 - 深入篇
深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...
- iOS开发笔记(二):block循环引用
写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...
- iOS开发学习48 OC的lambda block
iOS开发学习48 lambda表达式 一.block 简介 二.block使用 1. block的写法大概就是这样: 2. 带参数的话可以这样写: 3. 如果不写入参,可以写: 4. 当然返回也可以 ...
- iOS 开发中的多线程
线程.进程 什么是线程.进程 有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...
- iOS开发-面试总结(九)
iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...
最新文章
- Python文件打包成exe
- 面试:从volatile说到i++的线程安全问题
- 外包网络推广公司浅析想保持稳定的SEO排名和流量,需要做什么呢?
- Docker管理面板Portainer中文汉化教程
- android 百度地图 在线建议查询,Android 百度地图 SDK v3_3_0 (五) ---POI搜索和在线建议查询功能...
- 报任安书文言现象_语文老师精心总结【文言文常考点】够你从初一用到初四!...
- ICMP (互联网控制消息协议 )是什么
- Python 爬虫性能相关总结
- php权限在哪设置,php如何设置管理员权限
- Ubuntu 16.04 LTS 下Nginx的编译安装与启动
- Mean-shift超像素分割
- Java三大主流框架
- Data Center TCP (DCTCP)学习笔记
- 看完淘宝技术这十年思考
- ADAS倒车雷达超声波传感器elmos524.03驱动
- 《C++程序设计》课程设计报告
- CryEngine5 Shader调试
- openpose vs2015 cuda8.0 cudnn5.0 TiTan xp 环境配置
- HTML做一个圣诞页面(纯html代码)
- Oracle数据库实例之进程架构(二)