zoukankan      html  css  js  c++  java
  • Objective-C_Block

    一、Block语法

    Block:块语法,本质上是匿名函数(没有名称的函数),Block变量存放函数的实现,通过Block变量能直接调⽤函数。标准C里面没有Block。C语言的后期扩展版本号。加⼊了匿名函数。C++、JS、Swift等语⾔,有相似语法。叫做闭包。

    Block语法和函数指针非常相似。

    Block语法

    • Block类型:int (^)(int)
    • Block变量:myBlock
    • Block值:^ int (int num){ return 7 * num;}
    • 即:^ 返回值类型 (參数列表){函数体} 当中 返回值类型 能够省略。
            /* Block 类型: int (^)(int, int)
             * Block 变量: block1
             * Block 的值: ^int (int x, int y) { return x + y; };
               ^ 返回值类型 (參数列表) { 函数体 } (返回值类型能够省略)
             */
    
            /* 1. 无返回值, 无參数的Block */
            void (^block3)() = ^()
            {
                NSLog(@"Hello, World!");
            };
            block3(); /* Block调用 */
    
            /* 2. 无返回值, 有參数 */
            void (^block4)(int, int) = ^(int x, int y)
            {
                NSLog(@"%d", x + y);
            };
            block4(3, 45);
    
            /* 3. 有返回值, 无參数 */
            int (^block5)() = ^()
            {
                return 100;
            };
            NSLog(@"%d", block5());
    
            /* 4. 有返回值, 有參数 */
            int (^block6)(int, int) = ^(int x, int y)
            {
                return x > y ?

    x : y; }; NSLog(@"%d", block6(3, 5));


    二、Block使⽤

    int (^block1)(int x, int y) = ^(int x, int y) {
      return x + y;
    };
    int a = block1(32, 34);  // block的使⽤和函数指针的使用相似
    NSLog(@“%d”, a);  // 打印结果:66

    Block进⾏typedef

    • typedef int (^BlockType)(int x, int y)

    • 原类型:int (^)(int x, int y)

    • 新类型:BlockType

    /* Block typedef */
    typedef int(^blockType)(int, int);
    
    blockType block1 = ^(int x, int y) {
                return x + y;
            };
    NSLog(@"%d", block1(3, 5));
    

    Block写法

    int (^block1)(int x, int y) = ^(int x, int y) {
      return x + y;
    };
    
    BlockType block1 = ^(int x, int y) {
      return x + y;
    };
    

    上述两种实现是等价的。

    Blcok与局部变量和全局变量

            /* main函数外定义的全局变量 */
            int n = 100;
    
            /* 知识点4 Block与局部变量 全局变量 */
            /* 局部变量 */
            int a = 100;
    
            int (^block)() = ^() {
                return a;
            };
            NSLog(@"%d", block());
    
            int (^block2)() = ^() {
    //            a = 200;
                return a;
            };
            /* 总结: 默认情况下, block能够訪问但不能更改局部变量 */
    
            __block int b = 200;
            int (^block3)() = ^() {
                b = 300;
                return b;
            };
            NSLog(@"%d", block3());
            /* 总结: 用__block修饰的局部变量, Block里面能够更改值 */
    
    
            /* Block 与全局变量 */
    
            int (^block4)() = ^() {
                n = 200;
                return n;
            };
            NSLog(@"n = %d", block4());
    
            static int num = 1;
            int (^block5)() = ^() {
                num = 8;
                return num;
            };
            NSLog(@"num = %d", block5());
    

  • 相关阅读:
    texturePacker黄色文件夹和蓝色文件夹
    自定义相机下使用clippingNode注意事项
    cocos2dx 3.3多相机下_transformUpdated bug
    一定不要在头文件中using namespace XXX
    cocos2dx 3.3将坐标由父空间转化到局部空间
    cocos2dx 3.3 getParentToNodeTransform bug
    cocos2dx 3.x designResolutionSize须主动设置
    mysql操作查询结果case when then用法举例
    java List.subList方法中的超级大陷阱
    Linux下修改Mysql的用户(root)的密码
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7284594.html
Copyright © 2011-2022 走看看