美文网首页
block 的修饰符

block 的修饰符

作者: 啷里个啷里个啷个里个啷 | 来源:发表于2016-12-22 10:02 被阅读0次

_block & _weak:

ARC下

在block代码块中也会用类似代码来修饰变量,例如:__weaktypeof(self) wself =self;

__block  为了改变block代码块外部的变量。例如:你在外面定义了一个整形变量,想要在block块内改变他,那么,就要用__block 来修饰这个整形变量。

__weak 是为了防止循环引用,引起内存泄露的问题。

_block和__weak修饰符的区别:

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

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

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

PS:__unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的__weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。

__weak 本身是可以避免循环引用的问题的,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题,我们可以通过在 block 内部声明一个 __strong 的变量来指向 weakObj,使外部对象既能在 block 内部保持住,又能避免循环引用的问题

__block 本身无法避免循环引用的问题,但是我们可以通过在 block 内部手动把 blockObj 赋值为 nil 的方式来避免循环引用的问题。另外一点就是 __block 修饰的变量在 block 内外都是唯一的,要注意这个特性可能带来的隐患。

在MRC下,我们通常使用__block ,而在ARC下我们通常使用__weak , 或者__unsafe_unretaine __block(不安全,不建议使用) 来修饰对象防止循环引用而造成的内存泄露。

注意:在非ARC环境中__block可以解决循环引用问题。

相关文章

网友评论

      本文标题:block 的修饰符

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