__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。
网友评论