国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

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

2019-11-06 09:36:32
字體:
來源:轉載
供稿:網友

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修飾的局部變量,發現也是能夠修改的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嫩江县| 苍南县| 云和县| 定西市| 崇信县| 外汇| 获嘉县| 共和县| 镇康县| 炎陵县| 厦门市| 玛沁县| 娱乐| 淳化县| 营口市| 永泰县| 宁波市| 新余市| 潜江市| 红安县| 买车| 乐都县| 墨竹工卡县| 哈巴河县| 南溪县| 永康市| 疏附县| 枣阳市| 固镇县| 静安区| 岚皋县| 平谷区| 沾化县| 延津县| 龙山县| 霍邱县| 额济纳旗| 伊宁县| 淮滨县| 应用必备| 原阳县|