OC学习之block

2016-03-18  本文已影响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
    
}

上一篇下一篇

猜你喜欢

热点阅读