美文网首页
__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