美文网首页
iOS开发关于block和局部变量和全局变量

iOS开发关于block和局部变量和全局变量

作者: Robinone | 来源:发表于2018-11-15 13:49 被阅读0次

    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修饰的局部变量,发现也是能够修改的。

    作者:HRCoderGit
    来源:CSDN
    原文:https://blog.csdn.net/u013096533/article/details/58601812

    相关文章

      网友评论

          本文标题:iOS开发关于block和局部变量和全局变量

          本文链接:https://www.haomeiwen.com/subject/wykyfqtx.html