博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
block的一点知识
阅读量:4880 次
发布时间:2019-06-11

本文共 1279 字,大约阅读时间需要 4 分钟。

 

 

 

一个block的笔记: http://www.cnblogs.com/xinye/archive/2013/03/03/2941203.html

 

 

http://segmentfault.com/q/1010000000182523

 

在一个比较专业的人的博客中发现

Blocks可以访问局部变量,但是不能修改。

int multiplier = 7;     int (^myBlock)(int) = ^(int num) {         multiplier ++;//编译报错 return num * multiplier; };

如果要修改就要加关键字:__block

__block int multiplier = 7;     int (^myBlock)(int) = ^(int num) {         multiplier ++;//这样就可以了 return num * multiplier; };

但是他下面又是这样写的

NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil]; NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1]; [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){ [mArrayCount addObject:[NSNumber numberWithInt:[obj length]]]; }]; NSLog(@"%@",mArrayCount);

问,这样结果也是出来了,到底对还是不对

 

 

 

 

简单说就是 栈变量才受影响 堆变量不受影响你给的例子里面确实没有修改mArrayCount这个局部变量啊。mArrayCount是一个指针,指向一个可变长度的数组。在block里面,并没有修改这个指针,而是修改了这个指针指向的数组。换句话说,mArrayCount是一个整数,保存的是一块内存区域的地址,在block里,并没有改变这个地址,而是读取出这个地址,然后去操作这块地址空间的内容。

这是允许的,因为声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包。

但是当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。

这里说的比较详细

http://www.cnblogs.com/xinye/archive/2013/03/03/2941203.html

转载于:https://www.cnblogs.com/lushengcao/p/4916971.html

你可能感兴趣的文章
导入lxml找不到etree,报ImportError:DLL load failed:找不到指定的程序
查看>>
面向对象一
查看>>
大象的崛起!Hadoop七年发展风雨录
查看>>
图片二值化
查看>>
数据库常用函数
查看>>
集合之TreeSet(含JDK1.8源码分析)
查看>>
C语言学习的记忆
查看>>
Lucene学习总结之三:Lucene的索引文件格式(1) 2014-06-25 14:15 1124人阅读 ...
查看>>
node-sass 报错的解决方法
查看>>
Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值
查看>>
免费下载知网文献的方法 | sci-hub免费下载SCI论文方法
查看>>
测试用例,变量之间,相互调用的方法,和修改原来初始化变量的方法
查看>>
ASP.NET MVC中将控制器分离到类库的实现(转)
查看>>
Poj 2304 Combination Lock(模拟顺、逆时钟开组合锁)
查看>>
Palindrome Number
查看>>
H5上传功能
查看>>
PHP命名空间(Namespace)的使用详解
查看>>
java项目@override报错问题
查看>>
DataTable 和Json 字符串互转
查看>>
Django中Template does not exit
查看>>