面试首页投稿(暂停使用,暂停投稿)iOS Developer

block 从浅到深(二)

2016-07-31  本文已影响181人  比沉默寡言话多

关于各种变量在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原理的文章中讲

上一篇下一篇

猜你喜欢

热点阅读