zoukankan      html  css  js  c++  java
  • OC-block

    #import <Foundation/Foundation.h>
    
    /*
     block要掌握的东西
     1> 如何定义block变量
     int (^sumBlock)(int, int);
     void (^myBlock)();
     
     2> 如何利用block封装代码
     ^(int a, int b) {
        return a - b;
     };
     
     ^() {
        NSLog(@"----------");
     };
     
     ^ {
        NSLog(@"----------");
     };
     
     3> block访问外面变量
     * block内部可以访问外面的变量
     * 默认情况下,block内部不能修改外面的局部变量
     * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
     
     4> 利用typedef定义block类型
     typedef int (^MyBlock)(int, int);
     // 以后就可以利用MyBlock这种类型来定义block变量
     MyBlock block;
     MyBlock b1, b2;
     
     b1 = ^(int a, int b) {
        return a - b;
     };
     
     MyBlock b3 = ^(int a, int b) {
        return a - b;
     };
     */
    
    typedef int (*SumP)(int, int);
    
    
    typedef int (^MyBlock)(int, int);
    
    int sum(int a, int b)
    {
        return a + b;
    }
    
    int main()
    {
        // int (*p)(int, int) = sum;
        // int (*p2)(int, int) = sum;
        // SumP p = sum;
        // SumP p2 = sum;
        
        
        /*
        int (^sumBlock)(int, int);
        
        sumBlock = ^(int a, int b) {
            return a + b;
        };
        
        int (^minusBlock)(int, int) = ^(int a, int b) {
            return a - b;
        };*/
        
        MyBlock sumBlock;
        sumBlock = ^(int a, int b) {
            return a + b;
        };
        
        MyBlock minusBlock = ^(int a, int b) {
            return a - b;
        };
        
        
        MyBlock multiplyBlock = ^(int a, int b) {
            return a * b;
        };
        
        
        NSLog(@"%d - %d - %d", multiplyBlock(2, 4),  sumBlock(10 , 9), minusBlock(10, 8));
         
        return 0;
    }
    
    void test3()
    {
        int a = 10;
        __block int b = 20;
        
        void (^block)();
        
        block = ^{
            // block内部可以访问外面的变量
            //NSLog(@"a = %d", a);
            
            // 默认情况下,block内部不能修改外面的局部变量
            // a = 20;
            
            // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
            b = 25;
        };
        
        
        block();
    }
    
    // 有返回值、有形参的block
    void test2()
    {
        /*
         // 指针函数的指针
         int (*p)(int, int) = sum;
         int d = p(10, 12);
         NSLog(@"%d", d);
         */
        
        
        int (^sumblock)(int, int) = ^(int a, int b){
            return a + b;
        };
        
        int c = sumblock(10, 11);
        
        
        // 用一个block输出n条横线
        
        
        void (^lineBlock)(int) =  ^(int n)
        {
            for (int i = 0; i<n; i++) {
                NSLog(@"----------------");
            }
        };
        lineBlock(5);
    
    }
    
    // 没有返回值、没有形参的block
    void test()
    {
        // block用来保存一段代码
        // block的标志:^
        /*
         block跟函数很像:
         1.可以保存代码
         2.有返回值
         3.有形参
         4.调用方式一样
         */
        
        // 定义block变量
        /*
        void (^myblock)() = ^(){
            NSLog(@"----------------");
            NSLog(@"----------------");
        };*/
        
        // 如果block没有形参,可以省略后面的()
        void (^myblock)() = ^{
            NSLog(@"----------------");
            NSLog(@"----------------");
        };
        
        // 利用block变量调用block内部的代码
        myblock();
        
        myblock();
    }
    • Block封装了一段代码,可以在任何时候执行
    • Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
    • 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
     

    Blocks的定义:

    int (^MySum)(int, int) = ^(int a, int b) {
    
      return a+b;
    
    };

    定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现

    Block可以访问局部变量,但是不能修改。

    int sum = 10;
    
    int (^MyBlock)(int) = ^(int num) {
    
      sum++;//编译报错
    
      return num * sum;
    
    };

    如果要修改就要加关键字:__block

    __block int sum = 10;

    Blocks和函数指针对比:

    • 定义函数指针   int (*myFn)();
    • 定义Blocks   int (^MyBlocks)(int,int);
    • 调用函数指针   (*myFn)(10, 20);
    • 调用Blocks    MyBlocks(10, 20);

    Blocks的赋值

    1,在声明的同时定义变量,然后赋值

    int (^MySum)(int,int) = ^(int a,int b) {

      return a + b;

    };

    2,也可先用typedef先声明类型,再定义变量进行赋值

    typedef int (^MySum)(int,int);

    MySum sum = ^(int a,int b) {

      return a + b;

    };

  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/IDRI/p/4983715.html
Copyright © 2011-2022 走看看