zoukankan      html  css  js  c++  java
  • Block(一)基础-b

    一、概述

    Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。

    二、热身

    先看一个比较简单的Block例子:

    1
    2
    3
    4
    int multiplier = 7;
    int (^myBlock)(int) = ^(int num) {
        return num * multiplier;
    };

    在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?

    来,让我们typedef一下

    1
    2
    3
    typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block
    typedef int (^IntBlock)(void);//一个没有参数,返回int的block
    typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block
    1
      

    三、更详细的例子

    注意,上面的typedef都还有效~

    主动调用一下:

    1
    2
    3
    4
    5
    6
    7
    8
    - (void)someMethod
    {
        BoolBlock ablock = ^(BOOL bValue) {
            NSLog(@"Bool block!");
        };
     
        ablock();
    }

    作为参数返回:

    1
    2
    3
    4
    5
    6
    7
    8
    typedef void (^BoolBlock)(BOOL);
    - (BoolBlock)foo()
    {
        BoolBlock ablock = ^(BOOL bValue) {
            NSLog(@"Bool block!");
        };
        return [ablock copy];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
    }

    类的一个成员:

    1
    2
    3
    4
    5
    6
    7
    8
    @interface OBJ1 : NSObject
    @property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们
    @end
     
    OBJ1 *obj1 = ...
    obj1.block = ^(BOOL bValue) {
            NSLog(@"Bool block!");
        };

    其他函数的参数:

    1
    2
    3
    4
    5
    6
    - (void)foo(BoolBlock block)
    {
        if (block) {
            block();
        }
    }

    甚至其他block的参数:

    1
    2
    3
    4
    BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}};
    HugeBlock hBlock = ^(BoolBlock bB) {bB();};
     
    hBolck(bBlock);

    啊,全局变量!:

    1
    2
    3
    4
    5
    6
    static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
    int main()
    {
        printf("%d ", maxIntBlock(2,10)); 
        return 0;
    }

    好了,你知道block大概能怎么用了。

    四,特殊的标记,__block

    如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        __block int i = 1024;
        BoolBlock bBlock = ^(BOOL bV) {
            if (bV) {
                i++;//如果没有__block标记,是无法通过编译的。
            }
        };
    }
     
     
     
  • 相关阅读:
    vue中添加favicon.ico
    SEO 小技巧汇总
    vue中echarts随窗体变化
    vue加载Element ui地址省市区插件-- element-china-area-data
    Echarts 修改折线的颜色和折线的点的大小方法
    vue中添加swiper轮播插件
    Cannot find module 'object-keys' 的解决办法
    适用于所有页面的基础样式base.css
    git clone时的各种报错汇总
    css mix-blend-mode 颜色滤镜混合模式
  • 原文地址:https://www.cnblogs.com/isItOk/p/8108255.html
Copyright © 2011-2022 走看看