美文网首页
Block学习总结一block分类

Block学习总结一block分类

作者: leafu | 来源:发表于2019-07-27 18:25 被阅读0次

    Block分类

    block定义的格式为: 返回值类型+block名+参数

    以下是无参数定义
    void(^BlockName)(void)
    
    以下是有参数定义
    void(^BlockName)(void)
    

    block的回调实现格式为:^+返回参数+{}实现

    有参数实现
    ^(int i,NSString *s){
        NSLog(@"%d %@",i,s);
    }
    
    无参数实现
    ^{
        NSLog(@"123");
    }
    

    block有三种类型:NSGlobalBlock全局区区,NSMallocBlock堆区,NSStackBlock栈区

    看如下代码打印结果

        void(^block)(void) = ^{
        };
        block();
        NSLog(@"%@",block);
    

    2019-07-27 18:06:51.412115+0800 Block学习[2910:612197] <NSGlobalBlock: 0x100850088>

    此时,block里面什么也没有做,block的类型为NSGlobalBlock,下面,我们在函数体里添点料

     __block int a = 10;
        void(^block)(void) = ^{
            a++;
        };
        block();
        NSLog(@"%@",block);
    

    2019-07-27 18:10:21.510121+0800 Block学习[2954:622388] <NSMallocBlock: 0x600001f7e550>

    这个时候打印的block类型变了,说明了什么?这就是block自动捕获变量,从而将对象从全局区copy到堆区。

    再看一种情况,直接打印block
      NSLog(@"%@",^{
            a++;
        });
    

    2019-07-27 18:17:49.176216+0800 Block学习[3028:642942] <NSStackBlock: 0x7ffeef5bf880>

    这就是最后一种类型,直接实现函数体。

    相关文章

      网友评论

          本文标题:Block学习总结一block分类

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