_ _block

_ _block测试

    __block int ta2 =10;

    NSLog(@"ta3:---初始化时--%p --%p",&ta2,ta2);

    TestBlock tBlock = ^void{

        ta2 =15;

        NSLog(@"ta3:---block内部--%p --%p",&ta2,ta2);

    };

    ta2 =3;

    NSLog(@"ta3:---block之后--%p --%p",&ta2,ta2);

    tBlock();

打印的结果

2020-05-20 17:15:52.020215+0800 Demo1[2649:2130912] ta3:---初始化时--0x16d0313c8 --0xa

2020-05-20 17:15:52.020511+0800 Demo1[2649:2130912] ta3:---block之后--0x281bcc9f8 --0x3

2020-05-20 17:15:52.020637+0800 Demo1[2649:2130912] ta3:---block内部--0x281bcc9f8 --0xf

初始化时 指针地址为 0x16d0313c8 经过block后 变为 0x281bcc9f8,而且以后都是 0x281bcc9f8,相当于将之前栈区的地址释放了,而使用复制出来的堆区地址,此时不管block外部还是内部ta2的内存地址都是一样的,进而不管在block外部还是内部都可以修改anInterger变量的值 ,直到变量作用域结束

如果不使用_ _block

    int ta1 =10;

    NSLog(@"ta3:---初始化时--%p --%p",&ta1,ta1);

    TestBlock tBlock = ^void{

      //  ta1 =15;  //不能对其修改 报错误信息:Variable is not assignable(missing __block type specifier)

        NSLog(@"ta1:---block内部--%p --%p",&ta1,ta1);

    };

    ta1 =3;

    NSLog(@"ta1:---block之后--%p --%p",&ta1,ta1);

    tBlock();

打印结果 

2020-05-20 17:23:20.181500+0800 Demo1[2653:2133418] ta3:---初始化时--0x16f5713cc --0xa

2020-05-20 17:23:20.181853+0800 Demo1[2653:2133418] ta1:---block之后--0x16f5713cc --0x3

2020-05-20 17:23:20.182037+0800 Demo1[2653:2133418] ta1:---block内部--0x2803502f0 --0xa

在block内部 复制了指针地址,当block调用结束后,该指针被释放,依然使用初始化时的指针,可以解释为:block会把ta1变量复制为自己私有的const变量,也就是说block会捕获栈上的变量(或指针),将其复制为自己私有的const变量,所以也不能修改,只是拿来使用

部分内容参考:http://www.cocoachina.com/articles/19165

你可能感兴趣的:(_ _block)