自己的筆記:
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();
打印出來的數(shù)據(jù)依次是:
text==0x105c61140
&text==0x7fff59f9f9f8
text==0x105c611c0
&text==0x7fff59f9f9f8
text==0x105c61140
&text==0x7fff59f9f970
test
可以看出來,block里的text和未改變值之前的text指向?qū)ο蟮牡刂范际?x105c61140,但是指針的地址是發(fā)生改變的。原因是block里訪問外部變量的時(shí)候,都會(huì)把指針進(jìn)行拷貝,并且這個(gè)步驟應(yīng)該是在編譯過程就發(fā)生了。
如果改成一下代碼
__block NSString *text = @"test";
打印依次是:
text==0x10a0db170
&text==0x60800005ba78
text==0x10a0db1f0
&text==0x60800005ba78
text==0x10a0db1f0
&text==0x60800005ba78
“test1”
這里可以看出指針text的地址都是0x60800005ba78,也就是說加了__block的外部對(duì)象在block內(nèi)部是指針引用,所以在block內(nèi)部打印text的時(shí)候,通過指針找到的對(duì)象是test1.