__block 关键字

作者: _maomao | 来源:发表于2018-11-01 21:09 被阅读4次
  1. 简介

    • 我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。另外,block的实现具有封闭性(closure),而又能够很容易获取上下文的相关状态信息。
    • block是代码块,其本质和变量类似。不同的是代码块存储的数据是一个函数体。使用Block,就可以像其他标准函数一样,传入参数,并得到返回值。

    block的格式:

     a:Block的返回值类型,可以为空(void);
    
     b:Block对象名称,可以理解为变量名;
    
     ^:块的语法标记,声明b为一个Block对象; 
    
     c:第一个参数类型
    
     d:第二个参数类型
    
     name1,name2:参数名;
    
     {}:Block代码块的主题部分。
    

例:

int (^myBlock)(int,int) = ^(int num1, int num2) {
        return num1 + num2;
    };
    NSLog(@"%d",myBlock(5,4)); 

打印结果:9。

  1. 定义和使用
    1. 定义无返回值、无参数的Block
// 1.定义无返回值、无参的Block
    void (^block1)() = ^() {
        NSLog(@"无返回无参的Block");
    };
    block1();
image.png
  1. 定义无返回值、有参数Block
// 2.定义无返回值、有参数的Block
    void (^block2)(int) = ^(int a) {
        NSLog(@"%d",a);
    };
    block2(2);
image
  1. 定义返回值为OC对象的Block
// 3.定义返回值为OC对象的Block
  NSString *(^block3)(NSString *) = ^(NSString *string) {
      string = [NSString stringWithFormat:@"%@_%@",string,string];
      return string;
  };
  NSLog(@"%@",block3(@"我是字符串"));
image

由以上可知,定义Block变量就相当于定义了一个函数,只有在调用block的时候才会执行其主体块{}里面的代码

  1. __block关键字的使用
    在Block的代码块里,是不能修改在外面定义的变量,并且在给block赋值的时候,已经对代码块里的变量做了值的拷贝(只读不可修改)。
int x = 5;
  int (^block4)(int) = ^(int y) {
      int z = x + y;
      return z;
  };
  NSLog(@"%d,%d",x +=5,block4(5));

打印的值是10,10;

分析:变量x在Block外定义的,在Block代码块编译的时候,取的x的值为之前的5(不可修改)。因此即使执行x += 5的使x的值变为10,但Block代码块里的x依然是5,所以block(5)的值为5+5=10。

在变量前添加__block关键字进行修饰后,此变量在Block代码块里的就是可更改的(可读可写),执行代码时取变量最新的值。

__block int x = 5;
   int (^block4)(int) = ^(int y) {
       int z = x + y;
       return z;
   };
   NSLog(@"%d,%d",x +=5,block4(5));

打印的值是10,15;

相关文章

  • ios的block原理

    block:代码块,函数指针和指针 block:使用copy关键字 堆block:@propetry 栈block...

  • 再论block,以及weak和block关键字

    前几天去阿里面试,谈到block,我说加上__block关键字可以满足block内修改block外变量的需求,加上...

  • 关于Block

    关键字 block一般使用copy关键字进行修饰,block使用copy是从MRC遗留下来的“传统”,在MRC中,...

  • Block由浅入深(4):Block修改局部变量

    Block可以修改的变量 我们可能都知道,不使用__block关键字,我们不能在Block内修改变量的值。但是严格...

  • 第二节 block知识学习(copy,__weak,__bloc

    Dear All 这节我们来学习block知识 ,废话不说 、让我们直奔主题 __block关键字的作用 (基本数...

  • __block 关键字

    简介我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将任意的语句当做数...

  • __block关键字

    前提:Objective-C规定,在block中不能修改外部变量的值,若想修改则需在变量前边加__block关键字...

  • __block关键字

    一.Block内部为什么不能修改auto变量 在block内部修改auto变量时,编译器会报错,Variable ...

  • __block关键字

    前提:Objective-C规定,在block中不能修改外部变量的值,若想修改则需在变量前边加__block关键字...

  • Block - __block关键字的底层实现原理

    参考文档 iOS中__block 关键字的底层实现原理 你真的理解__block修饰符的原理么? iOS Bloc...

网友评论

    本文标题:__block 关键字

    本文链接:https://www.haomeiwen.com/subject/gkegtqtx.html