OC 代碼塊

    //代碼塊:普通代碼塊  構造代碼塊  靜態代碼塊數組

   

    //.定義一個普通代碼塊函數

    //定義方式返回類型 (^代碼塊名稱) (參數類型) = ^(參數類型 參數名){};spa

    //1.無返回類型的代碼塊 參數類型可爲空也可爲其餘類型3d

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

    {排序

        NSLog(@"hello world");遞歸

    };ip

    my_block1();作用域

    

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

    {

        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的值被修改

相關文章
相關標籤/搜索