__block和非__block

自己的笔记:

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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,472评论 0 35
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,771评论 0 4
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,046评论 0 12
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,028评论 0 7
  • 没有学过彩铅画,自己随便画画,如果哪位亲有教程,还望分享一下,谢谢!
    时光莲心阅读 279评论 1 4