assign 和 weak
之前写过两者区别:问题:什么情况使用 weak 关键字,相比 assign 有什么不同?
- assign 和 weak 都是不会增加对象的引用计数(弱引用),它们之间的区别是:当对象被销毁时,weak 修饰的变量指针会置为 nil,但是 assign 修饰的变量还是会指向原来的地址(这里就会出现野指针)。
- 在我们平时开发一般都是用 assign 来修饰基本类型,weak 来修饰对象。
__block 和 __weak
- 先来说一下 __weak,通过 __weak 来增加一个弱引用,这里常用来打破循环引用。
- __block主要是为了解决 block 中匿名函数截获变量,产生的生命周期的问题。block 截获外部变量,默认是不可以取修改变量的,但是通过 __block 修饰的变量,在 block 内部可以修改。
- __block:使用 __block修饰的变量在block代码块中会被retain(ARC下会retain,MRC下不会retain)
- __weak:使用__weak修饰的变量不会在block代码块中被retain
同时,在ARC下,要避免block出现循环引用 __weak typedof(self)weakSelf = self;
网友评论