_ _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变量,所以也不能修改,只是拿来使用
网友评论