美文网首页
__weak与__block的区别

__weak与__block的区别

作者: 小的牙牙菜 | 来源:发表于2017-09-28 18:28 被阅读0次

1.由上篇文章,已经了解到,weak是可以避免循环引用的,那么__weak的作用是什么呢,答案是:也是避免循环引用的,只不过__weak一般是在使用block的时候,用来避免循环引用的。但是要注意的是,由于__weak,不持有该对象,如果在该对象已经释放了之后,再访问block的话,在block内部就无法再访问到该对象了,为了避免该情况的发生。可以在block内部,再声明一个__strong变量来指向weakObj,使外部对象既能在 block 内部保持住,又能避免循环引用的问题。
使用时,代码如下:

MyObject *obj = [[MyObject alloc] init];
    
    __weak MyObject *weakObj = obj;
    obj.block = ^{
        __strong MyObject *strongObj = weakObj;
    };

那么__block可以避免循环引用么,答案是不可以的。因为__block会持有该对象,即使超出了该对象的作用域,该对象还是会存在的,直到block对象从堆上销毁;而__weak仅仅是将该对象赋值给weak对象,当该对象销毁时,weak对象将指向nil。
2.那么__block有什么作用呢?
(1)我们知道,在使用block中,block内部是可以访问外部的变量的,但是却不能修改外部变量。如下代码:

image.png

这时候Xcode会提示x变量错误信息:Variable is not assigning (missing __block type)。
若要修改这个外部变量,__block就派上用场了,我们需要给这个变量加上__block修饰符。
(2)没有__block修饰的时候,在调用block的时候,只是在创建block的时候,直接捕获了该变量的当前值(当前值,要注意哈),而再block之后,无论如何改变这个变量的值,block内部里的这个变量的值,始终保持捕获时的值,如下代码所示:

    [super viewDidLoad];
    
    int count = 10;
    self.block = ^{
        NSLog(@"%zi",count);
    };
    count = 5;
    self.block();
}

输出结果为10,而不是5

block使用举例[56199:3675614] 10

而如果加了__block修饰符的话,__block实际是指向了变量的地址,后期该变量改变时,__block指向的变量的值也改变。
代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    __block int count = 10;
    self.block = ^{
        NSLog(@"%zi",count);
    };
    count = 5;
    self.block();
}

输出结果为:

block使用举例[56432:3683108] 5

那为什么加上__block就可以指向变量的地址了呢,且看下篇文章,下篇文章,将深入研究block的内部原理。

相关文章

  • iOS开发基础--strong,weak,retain,assi

    weak和strong的区别: copy与retain的区别: __block和__weak修饰符的区别

  • __weak与__block区别

    原文链接:http://honglu.me/2015/01/06/weak与block区别/ 结论 __weak ...

  • __weak与__block区别

    首先我定义了一个类 MyObject 继承 NSObject,并添加了一个属性 text,重写了descripti...

  • __weak与__block区别

    公司最近在招 iOS,我面试了几个人,问到 block 避免循环引用的问题时,发现好多人都说通过添加__block...

  • __weak 与 __block 的区别

    Blocks理解: Blocks可以访问局部变量,但是不能修改 如果修改局部变量,需要加__block __blo...

  • __weak与__block的区别

    1.由上篇文章,已经了解到,weak是可以避免循环引用的,那么__weak的作用是什么呢,答案是:也是避免循环引用...

  • __block与__weak的区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

  • ios常见试题摘要(选自网络)

    ** __block __weak __strong __unsafe_unretained区别 **__bloc...

  • 基础题

    block和weak的区别 block可以修饰对象和基本数据类型 weak只能修饰对象,也只能在ARC下使用 bl...

  • __block与__weak的真正区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

网友评论

      本文标题:__weak与__block的区别

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