你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發關於block和局部變量和全局變量

iOS開發關於block和局部變量和全局變量

編輯:IOS開發綜合

IOS開發關於block和局部變量和全局變量

block內部引用全局變量和局部變量一直都是一個坑
block與局部變量

- (void)aboutBlock1{

    __block int index = 100;
    int (^myBlock)(int addNum) = ^(int addNum){
        index += addNum;
        return index;
    };

    NSLog(@"在內部修改了局部變量值後 == %d",myBlock(50));
    //打印結果  在內部修改了局部變量值後 == 150

    NSLog(@"在內部修改了局部變量值後再打印 == %d",myBlock(50));
    //打印結果  在內部修改了局部變量值後再打印 == 200

    index = 50;

    NSLog(@"在外部修改了局部變量值後 == %d",myBlock(50));
    //打印結果  在外部修改了局部變量值後 == 100

}

用__block修飾了局部變量之後,在block內部和外部都可以對局部變量進行修改。

- (void)aboutBlock2{
    int block2 = 20;
    int (^myBlock2)(void) = ^(){
        return block2;
    };
    NSLog(@"局部變量不用__block修飾外部不修改 == %d",myBlock2());
    //打印結果 局部變量不用__block修飾外部不修改 == 20

    block2 = 40;
    NSLog(@"局部變量不用__block修飾外部修改 == %d",myBlock2());
    //打印結果 局部變量不用__block修飾外部修改 == 20

}

如果不用__block修飾block,block內部不可以對局部變量進行修改,否則編譯不通過。且在block外部修改變量值,並不影響block捕獲的局部變量值,這種情況,block內部的局部變量的值只是block捕獲局部變量時的值。如下邊代碼:

  block2 = 40;
    NSLog(@"局部變量不用__block修飾外部修改 == %d",myBlock2());
    //打印結果 局部變量不用__block修飾外部修改 == 20

block捕獲block2這個局部變量值時,block2的值為20,所以在調用block之前修改block2的值為40,對block不起作用。

block與全局變量

//全局變量numble初始化賦值70

@interface ViewController ()
@property (nonatomic,  assign) int       numble;

@end

- (void)aboutBlock3{
    __weak typeof(self) weakself = self;
    int (^myBlock3)(int addNum) = ^(int addNum){
        return weakself.numble + addNum;
    };
    NSLog(@"全局變量不用__block修飾外部不修改 == %d",myBlock3(30));
    //打印結果 全局變量不用__block修飾外部不修改 == 100
}
- (void)aboutBlock4{
    __weak typeof(self) weakself = self;
    int (^myBlock4)(int addNum) = ^(int addNum){
        return weakself.numble + addNum;
    };

    self.numble = 170;
    NSLog(@"全局變量不用__block修飾外部修改 == %d",myBlock4(30));
    //打印結果 全局變量不用__block修飾外部修改 == 200


}

block內部引用局部變量,不使用__block修飾,在block外部改變了局部變量的值,block內部的局部變量只保存了捕獲時的值。block內部引用全局變量,在block外部修改了全局變量的值,block捕獲的是當前的值。

- (void)aboutBlock6{
    __weak typeof(self) weakself = self;
    int (^myBlock6)(int addNum) = ^(int addNum){
        return weakself.numble += addNum;
    };
    NSLog(@"全局變量在block內部被修改 == %d",myBlock6(50));
    //打印結果 全局變量在block內部被修改 == 220
}

block內部引用局部變量,不用__block修飾,不可以修改局部變量的值,但是block內部引用全局變量,可以在block內部修改全局變量的值。

提示:為了避免循環引用,在block內部應該使用weakself。(__weak typeof(self) weakself = self;)

static修飾全局變量對block的影響

static int block5 = 15;
- (void)aboutBlock5{
    int (^myBlock5)(int addNum) = ^(int addNum){
        return block5 + addNum;
    };
    NSLog(@"static全局變量在block內部不被修改 == %d",myBlock5(50));
    //打印結果 static全局變量在block內部不被修改 == 65
}
- (void)aboutBlock7{
    int (^myBlock7)(int addNum) = ^(int addNum){
        return block5 += addNum;
    };
    myBlock7(70);
    NSLog(@"static全局變量在block內部被修改 == %d",block5);
    //打印結果 static全局變量在block內部被修改 == 85

}

static定義一個內部變量,在block內部可以修改

- (void)aboutBlock8{
    int (^myBlock8)(int addNum) = ^(int addNum){
        return block5 += addNum;
    };
    block5 = 35;
    NSLog(@"全局變量在block內部和外部都被修改(沒有調用block) == %d",block5);
    myBlock8(50);
    NSLog(@"全局變量在block內部和外部都被修改 == %d",block5);
    //打印結果 全局變量在block內部和外部都被修改(沒有調用block) == 35 全局變量在block內部和外部都被修改 == 85
}

block內部static修飾局部變量

- (void)aboutBlock9{
    static int block9 = 40;
    int (^myBlock9)(int addNum) = ^(int addNum){
        return block9 += addNum;
    };
    myBlock9(30);
    NSLog(@"static修飾局部變量,block內部修改 == %d",block9);
    //打印結果 static修飾局部變量,block內部修改 == 70
}

static修飾了局部變量,延長了局部變量的生命周期,在block內部也是可以對局部變量進行修改的

- (void)aboutBlock10{
    static int block10 = 40;
    int (^myBlock10)(int addNum) = ^(int addNum){
        return block10 += addNum;
    };
    block10 = 80;
    NSLog(@"static修飾局部變量,block外部修改 == %d",myBlock10(30));
    //打印結果 static修飾局部變量,block外部修改 == 110
}

在block外部修改static修飾的局部變量,發現也是能夠修改的。

以上就是IOS開發關於block和局部變量和全局變量的全文介紹,希望對您學習和使用IOS應用開發有所幫助.

【iOS開發關於block和局部變量和全局變量】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved