_ _block

作者: MCWorld | 来源:发表于2020-05-20 17:30 被阅读0次

    _ _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

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