C语言特性(块)

作者: JackLu经纬 | 来源:发表于2015-12-23 00:45 被阅读0次

    (Block)是Objective-C对ANSI C所做的扩展,使用块可以更好地简化Objective-C编程,而且Objective-C的很多API都依赖于块

    块的基本语法

    定义块的语法格式如下:

    ^[块返回值类型] (形参类型1 形参1,形参类型2 形参2,  ...){
        //块执行体
    }
    

    从上面的语法格式可以看出,定义块的语法非常像定义一个函数,但只是定义一个匿名函数。定义块与定义函数的语法格式存在如下差异。

    1.定义块必须以^开头。
    2.定义块的返回值类型可以省略,而且经常都会省略声明块的返回值类型。
    3.定义块无须指定名字。
    4.如果块没有参数,此时参数部分括号不能省略,但内部可以留空,通常建议使用void作为占位符。
    

    如果程序需要以后多次调用已经定义的块,那么应该将该块赋给一个块变量。定义块变量的语法格式如下:

    块返回值类型 (^块变量名) (形参类型1 , 形参类型2 , ... );
    例:
    //定义不带参数、无返回值的块
    void (^printStr) (void) = ^(void){
        NSLog(@"这是块");
    };
    //使用printStr调用块
    printStr();
    //定义带参数、有返回值的块
    double (^hypot) (double ,double) = ^(double num1 ,double num2){
        return sqrt(num1 * num1 + num2 * num2);
    };
    //调用块,并输出块的返回值
    NSLog(@"%g" , hypot(3,4));
    //也可以先只定义块变量:定义带参数、无返回值的快
    void (^print) (NSString *);
    //再将块赋值给指定的块变量
    print = ^(NSString * info){
        NSLog(@"info参数为:%@" , info);
    }
    //调用块
    print(@"测试块调用");
    

    块与局部变量

    块可以访问程序中局部变量的值,当块访问局部变量的值时,不允许修改局部变量的值
    如果不希望在定义块时就把局部变量的值复制到块中,而是等到执行时才去访问、获取局部变量的值,甚至希望块也可以改变局部变量的值,此时可以考虑使用_block修饰局部变量。

    例:
    //定义_block修饰的全局变量
    _block int my = 20;
    void (^printMy)(void) = ^(void){
        //运行时访问、获取局部变量的值,此处输出45
        NSLog(@"%d" , my);
        //尝试对_block局部变量赋值是允许的
        my = 30;
        //此处输出30
        NSLog(@"%d" , my);
    };
    my = 45;
    printMy();//调用块
    //由于块修改了_block局部变量的值,因此下面的代码输出30
    NSLog(@"块执行完后,my的值为:" , my);
    

    使用typedef定义块类型

    使用typedef可以定义块类型,定义了块类型后,该块类型主要有如下两个用途。

    1.复用块类型,使用块类型可以重复定义多个块变量。
    2.使用块类型定义函数参数,这样即可定义带块参数的函数。
    

    使用typedef定义块类型的语法格式如下:

    typedef 块返回值类型 (^块类型) (形参类型1 [形参名] ,形参类型2 [形参名] , ... );
    例:
    //使用typedef定义块类型
    typedef void (^FKPrintBlock) (NSString*);
    //使用FKPrintBlock定义块变量,并将指定块赋给该变量
    FKPrintBlock print = ^(NSString * info){
        NSLog(@"%@" , info);
    };
    //使用FKPrintBlock定义块变量,并将指定块赋值给该变量
    FKPrintBlock loopPrint = ^(NSString * info){
        for (int i = 0 ; i < 3 ; i++){
            NSLog(@"%@" , info);
        }
    };
    //一次调用两个块
    print(@"Objective-C");
    loopPrint(@"iOS");
    

    相关文章

      网友评论

        本文标题:C语言特性(块)

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