美文网首页
OC学习之block

OC学习之block

作者: 龙马君 | 来源:发表于2016-03-18 10:59 被阅读47次
    /**
     *  OC 的block,用于封装一段代码,可以在任何时候执行
     *  也可以作为函数参数和返回值
     *  block,在多线程、异步任务,集合遍历,集合排序、动画专场用得多
     *  跟C的函数指针很像
     *  格式:
        int (^myBlock)(int) = ^(int num){ return num * num; };
               |
        返回  block名称  参数     形参       block体            ;结尾
     *  使用:
     *  int x = myBlock(10, 20);
     */
    
    /**
     *  返回int,参数传入int,int 的block类型
     *
     */
    typedef int (^SubBlock)(int, int);
    
    
    void testBlockUse(){
        
        /**
         *  无返回值和参数列表的block
         */
        void (^myPrintBlock)() = ^{
            NSLog(@"myPrintBlock");
        };
        myPrintBlock();
        
        /**
         *  返回int,参数传入int,int 的block
         *
         */
        int (^sumBlock)(int, int) = ^(int a, int b){
            return a + b;
        };
        NSLog(@"sumBlock = %d", sumBlock(12, 13));
        
        
        SubBlock subBlock = ^(int a, int b){
            return a - b;
        };
        NSLog(@"subBlock = %d", subBlock(12, 13));
        
        /**
         *  使用__block才可以修改外部变量,否则这能读取不能写入
         *  无使用__block时,block拷贝了变量的副本;
         *  使用__block时,block保存变量的指针;
         */
        int val = 0;
        __block int val1 = 0;
        
        int test1 = 0;
        __block int test2 = 0;
        void (^myBlock)() = ^{
            // 保存val1、test2 的指针
            // 保存val、test的变量副本
            printf("myBlock val = %d\n", val);          // val = 0
            printf("myBlock val1 = %d\n", val1);        // val1 = 0
            // val = 1; 不能修改
            val1 = 1;
        
            printf("myBlock test1 = %d\n", test1);      // test1 = 0
            printf("myBlock test2 = %d\n", test2);      // test2 = 10
        };
        
        test1 = 10;
        test2 = 10;
        
        myBlock();
        
        printf("val = %d\n", val);              // val = 0
        printf("val1 = %d\n", val1);            // val1 = 1
        
        printf("test1 = %d\n", test1);          // test1 = 10
        printf("test2 = %d\n", test2);          // test2 = 10
        
    }
    
    

    相关文章

      网友评论

          本文标题:OC学习之block

          本文链接:https://www.haomeiwen.com/subject/sloclttx.html