自己的笔记:
NSString *text = @"test";
testBlock block = ^{
dispatch_queue_t t = dispatch_queue_create("test", NULL);
dispatch_sync(t, ^{
NSLog(@"text==%p",text);
NSLog(@"&text==%p",&text);
NSLog(@"%@",text);
});
};
NSLog(@"text==%p",text);
NSLog(@"&text==%p",&text);
text = @"test1";
NSLog(@"text==%p",text);
NSLog(@"&text==%p",&text);
block();
打印出来的数据依次是:
text==0x105c61140
&text==0x7fff59f9f9f8
text==0x105c611c0
&text==0x7fff59f9f9f8
text==0x105c61140
&text==0x7fff59f9f970
test
可以看出来,block里的text和未改变值之前的text指向对象的地址都是0x105c61140,但是指针的地址是发生改变的。原因是block里访问外部变量的时候,都会把指针进行拷贝,并且这个步骤应该是在编译过程就发生了。
如果改成一下代码
__block NSString *text = @"test";
打印依次是:
text==0x10a0db170
&text==0x60800005ba78
text==0x10a0db1f0
&text==0x60800005ba78
text==0x10a0db1f0
&text==0x60800005ba78
“test1”
这里可以看出指针text的地址都是0x60800005ba78,也就是说加了__block的外部对象在block内部是指针引用,所以在block内部打印text的时候,通过指针找到的对象是test1.
网友评论