美文网首页
__block和非__block

__block和非__block

作者: PKL | 来源:发表于2017-07-04 15:29 被阅读0次

自己的笔记:

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.

相关文章

网友评论

      本文标题:__block和非__block

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