Blocks

作者: 呉囲仌犮yzx | 来源:发表于2017-08-23 20:08 被阅读8次

    Blocks是C语言的扩充功能。  用一句话来概括就是:带有自动变量(局部变量)的匿名函数。

    在其他语言中Block的名称

    程序语言                       Block的名称

    C + Blocks                   Block

    Smalltalk                       Block

    Ruby                              Block

    LISP                               Lambda

    Python                           Lambda

    C ++11                            Lambda

    Javascript                       Anonymous function

    Blocks模式--Block语法

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

    ^ int (int count) {return count + 1}

    ^ 参数类型 表达式

    ^(int count) {return count + 1}

    ^ 表达式

    ^{printf("balabalabalabala");}    或者  ^ void (void) {printf("balabalabala");}

    声明Block类型变量仅仅是将声明函数指针变量的“*”变为“^”。该Block函数变量与一般的C语言变量完全相同,可作为一下用途使用:

    自动变量、函数参数、静态变量、静态全局变量、全局变量

    如以下例子可供参考:

    int (^blk) (int) = ^(int count){return count + 1}

    int (^blk1) (int) = blk;

    int (^blk2) (int);

    blk2 = blk1;

    在函数参数中使用Block类型变量可以向函数传递Block。

    通常我们使用typedef来声明Block类型变量,以达到简化使用函数指针类型时的复杂形式。

    typedef int (^blk_t) (int);

    在Block函数中可以截获自动变量值,但是不能改变其值。

    如需改变,需要__block定义自动变量即可达到目的。如:

    int val = 0;

    void (^blk)(void) = ^ {val = 1;};

    blk();

    printf("val = %d\n", val);

    如此即会报错。

    修改方案: 将val定义改为 : __block int val = 0;

    例2:

    id array =[ [NSMutableArray alloc] init];

    void (^blk) (void) = ^{

     id obj = [[NSObject alloc] init];

    [array addobect:obj];

    }

    不会报错。

    id array =[ [NSMutableArray alloc] init];

    void (^blk) (void) = ^{

        array = [ [NSMutableArray alloc] init];

    }

    如此则会报错啦。若将array定义前加__block 则不会出错了。

    因为在Block函数中可以使用截获的值但是不能直接像截获的变量array赋值。

















    相关文章

      网友评论

          本文标题:Blocks

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