美文网首页
__block和__weak修饰符的区别

__block和__weak修饰符的区别

作者: x了个w | 来源:发表于2017-12-21 18:54 被阅读25次

    block下循环引用的问题

    __block本身并不能避免循环引用,避免循环引用需要在block内部把__block修饰的obj置为nil

    __weak可以避免循环引用,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题,我们可以通过在 block 内部声明一个 __strong

    的变量来指向 weakObj,使外部对象既能在 block 内部保持住,又能避免循环引用的问题

    __block与__weak功能上的区别。

    __block会持有该对象,即使超出了该对象的作用域,该对象还是会存在的,直到block对象从堆上销毁;而__weak仅仅是将该对象赋值给weak对象,当该对象销毁时,weak对象将指向nil;

    __block可以让block修改局部变量,而__weak不能。

    另外,MRC中__block是不会引起retain;但在ARC中__block则会引起retain。所以ARC中应该使用__weak。

    因此,__block和__weak修饰符的区别其实是挺明显的:

    1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。

    2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。

    3.__block对象可以在block中被重新赋值,__weak不可以。

    4.__block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用,__weak只在ARC下使用,可以避免循环引用。

    相关文章

      网友评论

          本文标题:__block和__weak修饰符的区别

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