OC 代码块

    //代码块:普通代码块  构造代码块  静态代码块

   

    //.定义一个普通代码块

    //定义方式返回类型 (^代码块名称) (参数类型) = ^(参数类型 参数名){};

    //1.无返回类型的代码块 参数类型可为空也可为其他类型

    void (^my_block1) (void) = ^(void)

    {

        NSLog(@"hello world");

    };

    my_block1();

    

    void (^my_block) (int) = ^(int number)

    {

        number = 1;//带参数进入代码块运算 结果为5 当进入作用域里面的时候给number再次赋值 此时5将被覆盖 结果number1

        NSLog(@"%i",number);

    };

    my_block(5);

    

    //2.有返回类型的代码块

    int (^my_blockI) (int number) = ^(int number)

    {

        return number * number;

    };

    int num = my_blockI(10);

    NSLog(@"%i",num);

    

    //定义方式返回类型 (^代码块名称) (参数类型);

    //           代码块名称 = ^(参数类型 参数名){};

    void (^my_block2) (int);

     my_block2 = ^(int number)

    {

        NSLog(@"%i",number);

    };

    my_block2(9);

    

    //带两个参数的代码块

    int (^sumBlock) (int,int) = ^(int number1,int number2)

    {

        return number1 + number2;

    };

    int result = sumBlock(5,9);

    NSLog(@"result:%i",result);

    

    //在代码块外边定义的变量可以在代码块里面使用

    int addSum = 0;

    for (int i=1; i<=10; i++) {

        addSum = sumBlock(addSum,i);

    }

    NSLog(@"sum:%i",addSum);

    

    

    //.构造代码块

    //用构造块的关键字定义代码块 typedef  注意:参数类型和参数的个数要保持一致

    

    typedef void (^my_block3)(int);//构建了一个代码块类型

    my_block3 num1 = ^(int number)

    {

        NSLog(@"num:%i",number);

    };

    num1(8);

    

    //数组的一个方法 代码块可以作为一个参数 该方法可对一个数组进行排序 sortedArrayUsingComparator

    NSArray *array = @[@"hello",@"person",@"father",@"hunter"];

    NSArray *arr = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

        return [obj1 compare:obj2];

    }];

    NSLog(@"%@",arr);

    

    //--------局部变量

    int  a=10, b=20;

    typedef int (^multiplyBlock)(void);

    multiplyBlock multiply = ^(void)

    {

        return a * b;

    };

    NSLog(@"result1=%i",multiply());//输出结果为200

    a=20,b=30;

    NSLog(@"result2=%i",multiply());//输出结果还是200 a b的值没有发生改变

    

    //---------全局变量

    static int c=10, d=20;

    typedef int (^multiplyBlock2)(void);

    multiplyBlock2 multiplyI = ^(void)

    {

        return c*d;

    };

    NSLog(@"result3=%i",multiplyI());//输出结果为200

    c=20,d=30;

    NSLog(@"result4=%i",multiplyI());//输出结果为600 a b的值发生改变

    

    

//    static void (^addblock)(int,int) = ^(int i,int sum)

//    {

//        for (i=0; i<11; i++) {

//            sum += i;

//        }

//       

//        NSLog(@"result=%i",sum);

//    };

//    addblock(0,0);

    

    //.静态代码块

    //代码块的递归调用 (递归调用的意思是自己可以调用自己) 递归调用的前提是代码块变量必须是全局变量或静态变量

    static void(^const block)(int) = ^(int i)

    {

        if (i>0) {

            NSLog(@"num:%i",i);

            block(i-1);

        }

    };

    block(3);

    

    //递归方式计算110的和

    static int(^sum_block)(int) = ^(int number1)

    {

        if (number1<11) {

//            NSLog(@"sum:%i",number1);

           number1 += sum_block(number1+1);

           NSLog(@"sum:%i",number1);

            

        }

        return number1;

       

    };

    sum_block(1);

    

    

   

    static int i =10;

    typedef int (^block3)(void);

    block3  tem = ^(void)

    {

        i += 1;

        return i;

    };

    NSLog(@"%i,%i",i,tem());

    

    //在代码块中可以使用代码块改变全局变量

    void(^block4)(void) = ^(void)

    {

        global++;//在主函数外定义

        NSLog(@"%d",global);

    };

    //此时在代码块外的全局变量的值也发生了改变

    block4();

    NSLog(@"%i",global);

    

    

    //__block在代码块内部可以修改代码块外部的值

    __block int a1= 10;

    int (^block5)(int,int) = ^(int data1,int data2)

    {

        a1 = data1 * data2;

        return a1;

    };

    NSLog(@"dataResult:%i",block5(3,5));//此时a1的结果为15 a1的值被修改


你可能感兴趣的:(OC 代码块)