zoukankan      html  css  js  c++  java
  • Block

    一、Block的基本定义

    Block的基本写法(也是详细写法):

    returnType (^blockName)(params) = ^returnType(params) {
        // code... 
    };

    中文再解释:返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 },例:

    int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){
        return 100;
    };

    如果你的Block不需要返回类型和参数,那么你可以简写为:

    void (^myBlock2)() = ^(){
        
    };

    void (^myBlock2)(void) = ^void(void){
        
    };

    返回类型或参数,没有的话可以用“void”代替。

    你也可以把等于号右边,^后的()删除,即是:

    void (^myBlock2)() = ^{
        
    };

    这样是不是很简洁?

    你也可以先定义一个Block函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:

    void (^myBlock2)(void);
    myBlock2 = ^{
        
    };

    二、Block作为方法定义

    把Block定义在方法里,与上面不同的是,Block的名字不需要在声明时写上,而是在后面,像这样:

    复制代码
    - (void)getWtihBlock:(void (^)())block
    {
        // code...
        
        // 记得要调用block
        block();
    }
    复制代码

    使用方法:

    [self getWtihBlock:^{
        NSLog(@"sdf");
    }];

    下面作了一个详细点的例子,并写了备注:

    复制代码
    /**
     *  追加自身字符串N次(每次复制前加一个换行
    )
     *
     *  @param string      字符串
     *  @param count       追加次数
     *  @param stringBlock 目标Block,其中str参数为结果字符串
     */
     // Block也可以定义在方法里,但是不需要定义Block的名字
     // IOS开发很多的API也用到了Block,像UIView的块动画
    - (void)getStrWithString:(NSString *)string
                   CopyCount:(int)count
                resultString:(void (^)(NSString *str))stringBlock
    {
        NSMutableString *newString = [NSMutableString stringWithString:string];
        for (NSUInteger i = 0; i < count; i++) {
            NSUInteger len = [string length];
            NSString *insertString = [NSString stringWithFormat:@"
    %@", string];
            [newString insertString:insertString atIndex:len];
        }
        // 调用block,传入字符串newString
        stringBlock(newString);
    }
    复制代码

    用法也是一样:

    复制代码
    BlockObject *block = [[BlockObject alloc] init];
    [block getStrWithString:@"Garvey"
                  CopyCount:3
               resultString:^(NSString *str) {
                   // str为处理后的结果
                   NSLog(@"str is %@", str);
               }];
    复制代码

    有时候复杂的Block语法会令到函数的声明难以阅读,所以会经常使用typedef对Block起一个新类型。

    typedef void (^ResultBlock)(NSString *str);

    定义方法时就变成了:

    - (void)getStrWithString2:(NSString *)string
                    CopyCount:(int)count
                 resultString:(ResultBlock)stringBlock;

    让我们对比一下,使用typedef前后:

    复制代码
    // 使用前
    - (void)getStrWithString:(NSString *)string
                   CopyCount:(int)count
                resultString:(void (^)(NSString *str))stringBlock;
    
    // 使用后
    - (void)getStrWithString2:(NSString *)string
                    CopyCount:(int)count
                 resultString:(ResultBlock)stringBlock;
    复制代码

    注意:使用方法是一样的,只不过定义变得简单了。

     Block基础部分

            1.Block的声明

                Block的定义和函数的声明差不多,就是把函数名改成(^blockName)即可。下面是block声明的代码。

                有返回值的

    1
    int (^sumBlock) (intint);

                无返回值的 

    1
    void (^myBlock)(intint);

              2.给block块赋值

               给声明好的block,赋值。block的值就是个函数体,给block块赋值有两种方式,一个在声明的时候赋值,一个是先声明在赋值。

                先声明再赋值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //代码块的声明
    void (^myBlock)(intint);
     
    //给代码块赋值
    myBlock = ^(int a, int b)
    {
        //test ++;  //报错
        NSLog(@"main_test = %d", test);
     
        //blockVar++不报错;
        blockVar ++;
        NSLog(@"blockVar = %d", blockVar);
     
        int sum = a + b;
        NSLog(@"a + b = %d", sum);
    };

                在声明的时候赋值

    1
    2
    3
    4
    5
    int (^sumBlock) (intint) = ^(int a, int b)
    {
        int sum = a + b;
        return sum;
    };

              3.调用block 

             block的使用和普通函数的使用相同,调用方法如下:

    1
    2
    //调用代码块并接收返回值
    int sum = sumBlock(20, 30);

             4.把block当做参数传入函数

    1
    2
    3
    4
    5
    6
    //把代码块作为函数参数
    void blockFunction(int (^myBlock)(intint))
    {
        int sum = myBlock(10,20);
        NSLog(@"fun_sum = %d", sum);
    }  

            5.在代码块中使用局部变量和全局变量

                在block中可以和对全局变量进行访问和修改,但对局部变量只可以访问,若想修改的话,我们可以在声明局部变量的时候加上关键字__block

                代码如下:

    1
    __block int blockVar = 0;
  • 相关阅读:
    c++再探string之eager-copy、COW和SSO方案
    C++之运算符重载
    numpy之随机数模块---random模块
    numpy之特征值、奇异值分解及其在图片处理中的应用
    numpy之傅里叶定理
    numpy之矩阵
    numpy之函数
    numpy之数据平滑处理
    numpy之多项式
    numpy之相关矩阵求解
  • 原文地址:https://www.cnblogs.com/pandas/p/4272181.html
Copyright © 2011-2022 走看看