美文网首页
_weak & _strong & _block 修饰作用

_weak & _strong & _block 修饰作用

作者: 小李不木 | 来源:发表于2021-08-18 09:58 被阅读0次

__weak修饰符的对象,等同于定义为weak的property。不会导致循环引用问题,当原对象没有任何强引用的时候,弱引用指针也会被设置为nil。

_weak & _strong 修饰block 的作用

1. __weak修饰的对象在block中不可以被重新赋值。weakSelf 是为了block不持有self,避免Retain Circle循环引用。 在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。

2. weakSelf之后,无法控制self 什么时候会被释放,为了保证在block内不会被释放,需要添加__strong。

3. 在block里面使用的__strong修饰的weakSelf是为了在函数生命周期中防止self提前释放。strongSelf是一个自动变量当block执行完毕就会释放自动变量strongSelf。不会存在循环引用问题。 如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。

__weak typeof(self) weakSelf = mm;

 self.doBlock = ^ { 

__strong typeof(mm) strongSelf = weakSelf; 

 };

block和weak的区别

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

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

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

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

ARC使用:__block修饰对象会增加引用

 __block typeof(self)  weakSelf = self;

 block 是通过添加引用来访问实例变量的,所以self会被retain一次,block也是一个强引用,会引起循环引用。

__weak  _Unsafe_Unretain 的区别?

1. weak较为安全:weak 修饰的指针变量,在指向的内存地址销毁后,会在 Runtime 的机制下,自动置为 nil, _Unsafe_Unretain不会置为 nil,容易出现 悬垂指针,发生崩溃。

3. __unsafe_unretained 比 __weak效率快:使用 weak 是有代价的,通过上面的原理可知,__weak需要检查对象是否已经消亡,而为了知道是否已经消亡,自然也需要一些信息去跟踪对象的使用情况。也正因此,__unsafe_unretained 比 __weak快,所以当明确知道对象的生命期时,选择__unsafe_unretained 会有一些性能提升,这种性能提升是很微小的。但当很清楚的情况下,__unsafe_unretained 也是安全的,自然能快一点是一点。而当情况不确定的时候,应该优先选用 __weak 。

4. unowned使用在Swift中,也会分 weak 和 unowned。unowned 的含义跟 __unsafe_unretained 差不多。假如很明确的知道对象的生命期,也可以选择 unowned。

只要block不引用外部局部变量,block就会被放在全局区。

1. MRC 管理block:只要block引用外部局部变量,block放在栈里面,block只能使用copy不能使用retain,用retain,block还是在栈里面。

2. ARC 管理block:  只要block引用外部局部变量,block就放在堆里面,block使用copy,尽量不要使用strong。

引用计数问题 :

NSStackBlock,NSGlobalBlock,执行retain都不起作用。

NSMallocBlock --执行retain引用计数+1。

NSStackBlock--copy:复制到堆上得到一份新的NSMallocBlock,NSStackBlock依然存在。

NSGlobalBlock--执行copy操作不起作用。

NSMallocBlock--执行copy操作会引起引用计数加1。

相关文章

网友评论

      本文标题:_weak & _strong & _block 修饰作用

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