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标记,是无法通过编译的。
            }
        };
    }
     
     
     
  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/isItOk/p/8108255.html
Copyright © 2011-2022 走看看