码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发中Block的理解与使用

时间:2016-05-28 12:48:48      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:

  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
  2. 定义和使用
    1. 定义无返回值、无参数的Block
      • // 1.定义无返回值、无参的Block
            void (^block1)() = ^() {
                NSLog(@"无返回无参的Block");
            };
            block1();
      • 技术分享
    2. 定义无返回值、有参数Block
      • // 2.定义无返回值、有参数的Block
            void (^block2)(int) = ^(int a) {
                NSLog(@"%d",a);
            };
            block2(2);
      • 技术分享
    1. 定义返回值为OC对象的Block
      • // 3.定义返回值为OC对象的Block
            NSString *(^block3)(NSString *) = ^(NSString *string) {
                string = [NSString stringWithFormat:@"%@_%@",string,string];
                return string;
            };
            NSLog(@"%@",block3(@"我是字符串"));
      • 技术分享
    • 由以上可知,定义Block变量就相当于定义了一个函数,只有在调用block的时候才会执行其主体块{}里面的代码
  3. __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;

  4. 作为OC对象的属性,实现对象之间的传值
    • Block可以看做是一个变量,因此可以作为OC对象的属性
    • 需求在ViewContrler的View上添加按钮,点击按钮模态跳转到FirstViewController视图控制器,FirstViewController的View上又两个按钮,一个是直接dismiss模态跳转到ViewController,一个是更改ViewController的背景色再dismiss模态跳转回ViewController
    • 分析FirstViewController是有ViewController模态推出的视图控制器,在FirstViewController里更改ViewController的背景色,这时就要做到反向传值。
    • 实现步骤
      1. 1.在FirstViewController.h文件里,定义将block变量作为@property属性
        • // 第一步定义, Block作为property属性
          /*
           void: Block的返回值为空,即无返回值;
           colorBlock: Block的作为对象属性时的属性名;
           (UIColor *color): Block的参数是UIColor实例对象
           */
          @property (nonatomic, copy) void(^colorBlock)(UIColor *color);

           

      2. FirstViewController.m文件里,在按钮点击触发的方法里给block传参,调用block。
        • // 随机生成的颜色
          UIColor *color = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
          // 第二步 给Block传入参数color
          if (self.colorBlock) {
              self.colorBlock(color);
          }
          [self dismissViewControllerAnimated:YES completion:nil];
      3. 在ViewController.m 文件里,实例化FirstViewController对象的地方,执行block代码块。
        • FirstViewController *fvc = [[FirstViewController alloc] init];
          // 执行Block代码块
           fvc.colorBlock = ^(UIColor *color) {
              self.view.backgroundColor = color;
          };
    • 效果展示
      •           技术分享

 

iOS开发中Block的理解与使用

标签:

原文地址:http://www.cnblogs.com/laoNanHai/p/5537037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!