浅谈block

Block.jpg

这道题目,很多人会认为6,但是答案是3, 其实这边和block关系并不大,主要还是num++++num之间的差别,C语言里的基础,num++是返回后自增,而++num是自增后返回。Ok,这不重要,我把这道题目发群里后,大家开始了一波讨论,首先,有人提出,如果把num用__block修饰,那输出肯定是6了,

__block.jpg

But,输出依旧是3,那人懵逼了,仔细一想,应该这么改:
__block.jpg

这样的话,结果就不一样了,很显然,这涉及到block的一些知识。

一:Block的分类

1.NSStackBlock:栈block
2.NSMallocBlock:堆block
3.NSGlobalBlock:全局block

二:Block对外界变量的获取

1.基本数据类型:局部变量
block会拷贝该变量的常量使用,外界修改的值不会影响block内部,并且block内部不能对其修改。
block内部修改外界变量的值会error,这个歌时候可以在前面加上__block修饰,这个变量相当于全局变量和静态变量。

int a = 0;
void (^block1)() = ^ {
    //        a++ 直接修改a会报错
    NSLog(@"a = %d",a);
};
a++;
block1(); //输出结果 a = 0;

__block int b = 0;
void (^block2) () = ^ {
    NSLog(@"block print b = %d",b); // 输出结果 b = 0;
    b = 2;
};
block2();
NSLog(@"out print b = %d",b); //输出结果 b = 2;

2.基本数据类型成员变量(实例变量),静态变量,全局变量
block直接访问变量地址,在block内部可以修改变量的值,并且变量被改变后,block内部也会随着改变。

self.num = 1;
self.num ++;
void (^block3) () = ^ {
    self.num++;
};
block3();
NSLog(@"%d",self.num);//输出结果为 3

3.指针类型: 成员变量(实例变量),静态变量,全局变量
block会复制一份指针并强引用指针所指对象,且内部不能修改指针的指向,但是可以修改指针所指向对象的值:

static NSString *staticStr = @"abc";
void (^block5) () = ^{
    NSLog(@"staticStr = %@",staticStr);
    staticStr = @"def";
    NSLog(@"staticStr = %@",staticStr);
};
staticStr = @"123";
block5();

所以说,对于开头题目的讨论,之所以是3是因为他只是拷贝了变量的常量,即使对其进行__block修饰,也是不会改变,除非是将__block修饰的变量直接修改,才会引起block内部的和变量的值的改变。

结束语

谢谢阅读,一起学习,本人也是出于交流学习,怕自己忘记,写的文章~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...
    Coder_JMicheal阅读 804评论 2 1
  • 前言 block的具体怎么使用我在这里就不一一细说, 我主要说的是关于block三种类型之间的区别, 以及blo...
    梦里桃花舞倾城阅读 224评论 0 0
  • 1. iOS Block用来封装一段代码块或者传递参数相对于代理使用起来方便,它本质上是一个匿名函数。 2.使用b...
    extanstory阅读 373评论 0 0
  • 摘要block是2010年WWDC苹果为Objective-C提供的一个新特性,它为我们开发提供了便利,比如GCD...
    西门吹雪123阅读 998评论 0 4
  • Block 是什么?Block 是一个匿名的函数,但是它能够捕获变量,这是它跟匿名函数的区别。 Block 是如何...
    jeff_guan阅读 466评论 0 0

友情链接更多精彩内容