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;

    };

  • 相关阅读:
    Seasar2:SAStruts:View(JSP)
    Seaser2:SAStruts:エラーメッセージの設定
    Seaser2:SAStruts:アクションとアクションフォーム(Struts)
    SAStruts アクションにJSONを返すメソッドを作成してみる
    S2JDBC テーブルを利用した独自仕様のid採番メソッド
    【C++ 异常】error: jump to case label [fpermissive]
    MusicXML 3.0 (15) 倚音
    MusicXML 3.0 (9) 小节线、反复线、终止线
    MusicXML 3.0 (13) 歌词
    MusicXML 3.0 (10) 换行、换页
  • 原文地址:https://www.cnblogs.com/IDRI/p/4983715.html
Copyright © 2011-2022 走看看