关于各种变量在block中的作用域.
//请先稍微大致浏览一下,早就懂的和老鸟请翻页.
void(^myBlock)(void);
int a =20;
myBlock = ^{
intb =20;
NSLog(@"%d", a); //这句话正常打印 说明block内能读取到block外的变量
NSLog(@"%d", b++); //连续两遍的打印结果都是 20;说明局部变量出了block就会销毁
// NSLog(@"%d", a++); //这句话会报错, 理由是变量a不可修改 xcode建议修改成 __block int a;
};
//NSLog(@"%d", b); //这句话会报错,说明block外读取不到bolck内部的变量
myBlock();
myBlock();//连续调用两次
先写了这么一段代码 这段代码我都再注释里解释了,如果有不清楚的,自己复制出去运行一下.
然后对这段代码进行了修改 同时由于oc最终都是用来写ios的,所以我引进来了一个label.声明为属性 并初始化
void(^myBlock)(void);
__block int a =3;
myBlock = ^{
self.label.text=@"world"; //发现声明的属性可以在block内进行修改
a =4; //而声明的变量要想修改必须在前面加一个__block 这里是两个下划线 .
static int b =3; //这里将变量声明周期延长
NSLog(@"%d", b++); //两次打印的结果 第一次为3 第二次为4 说明延长生命周期以后,第二次打印的b用的是第一次加1以后的值,而方法声明部分显然就不会再执行.
};
myBlock();
myBlock();
最后引进一个问题
void(^myBlock)(void);
int a = 3; //第二种 __block int a = 3;//第三种 static int a = 3;
myBlock = ^{
NSLog(@"%d", a); //为什么第一种打印结果是3 ? 为什么第二种打印结果是4? //第三种也是4?
//ps :后两种都可以进行值的修改
};
a = 4;
myBlock();
这个会在后面的关于block原理的文章中讲