美文网首页
Block相关(一)

Block相关(一)

作者: DDB_CS | 来源:发表于2017-11-16 14:29 被阅读16次

    1.Block入门

    Block是C语言的扩充功能。简单的来说:Block就是带有自动变量(局部变量)的匿名函数。这个可以类比C语言的函数指针。Block有着灵活和强大的功能,而且不需要命名。Block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。那block是OC对象吗?答案是肯定的。这里把学习Block的过程记录下来。

    1.1 Block的语法:

    ^ + 返回值类型 + 参数列表 + 表达式

    上面就是典型的block语法规范,举个简单例子:

    ^ NSInteger (NSInteger num1, NSInteger num2) {
                return num1 + num2;
            };// 一个返回num1 + num2 的简单block
    

    当然block语法可以省略,当返回值或参数列表为void时就可以省略,例子如下:

    
            ^(int count){count++; };// 等价于 ^void (int count){ count++; };
    
            ^{printf("hello block");}; //等价于 ^void (void){ printf("hello block"); };
     
    

    block语法还可以省略返回值类型,这是因为表达式中含有return语句时,其返回值类型必须与其一致,基于这种特性,我们可以省略返回值类型,简单样例如下:

    ^(int count){ return count++; };// 等价于^int (int count){ return count++; };   
    
    1.2 Block作为类型变量:

    在C语言中,我们知道声明一个函数指针的语法模式如下:

    int func(int count) {
        return count++;
    }
    
    int (*funcPtr)(int) = &func;
    

    同样的,block的语法类似:

     int (^func)(int) = ^ (int count) {
                               return count++;
                          };
    

    既然可以作为变量,那么用法就会非常灵活,我们可以在函数返回和使用block变量,可以将block作为函数参数,实例如下:

          // 定义几种类型的block
        typedef void (^blk_1) (void);
        typedef int (^blk_2) (void);
        typedef int (^blk_3) (int);
        
        // 1.作为函数返回;
        - (blk_1)func1 {
            return ^ {
                NSLog(@"block作为返回类型");
            };
        }
        //  2.作为参数
        
    - (void)func2:(blk_3)blk {
        blk = ^ (int count){
            return count ++;
        };
    }
    
    1.3 blcok赋值

    block的赋值

    格式:block = ^返回值类型(参数列表){}

    没有参数没有返回值

    myBlock testBlock = ^void(){
         NSLog(@"test");
     };
     // 没有返回值,void可以省略
    myBlock testBlock1 = ^(){
         NSLog(@"test1");
     };
     // 没有参数,小括号也可以省略
     myBlock testBlock2 = ^{
         NSLog(@"test2");
     };
    

    有参数没有返回值

    myBlock1 testBlock = ^void(NSString *str) {
          NSLog(str);
    }
    //省略void
    myBlock1 testBlock = ^(NSString *str) {
          NSLog(str);
    }
    

    有参数有返回值

    myBlock2 testBlock = ^NSString *(NSString *str) {
         NSLog(str)
         return @"hi";
    }
    //有返回值时也可以省略返回值类型
     myBlock2 testBlock2 = ^(NSString *str) {
         NSLog(str)
         return @"hi";
    }
    

    1.4 block作用

    block是用来封装一段代码,这段代码可以在任何时候调用

    与C中指向函数的指针 类似处

    block可以做为方法/函数的参数与返回值
    block可以接收参数与返回值

    与C中指向函数的指针 不同处

    block是inline的,并且对局部变量是只读的;

    相关文章

      网友评论

          本文标题:Block相关(一)

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