循环引用 && weak strong
@weakify _weak
_weak
@weakify(self); // RAC _weak的self_weak_变量
- 解决循环引用
- 问题: weakSelf是弱引用,会被释放
_weak typeof(self) weakSelf = self; self.block = ^{ dispatch_async(dispatch_get_global_queue(0,0),^{ [NSThread sleepForTimeInterval:1]; NSLog(@"%@",weakSelf); }); return self; };
- 循环引用的分类
- 父子对象关系
class Parent{ var name:String var child: Child? init(name: String){ self.name = name } } class Child{ var name: String weak var parent: Parent! init(name:String, parent: Parent){ self.name = name self.parent = parent } }
-
- 当block和闭包包含在类的成员变量中
> 闭包和block是独立的内存对象,会retain它们所引用的对象
> 有一个类中的block恰好引用这个类的属性或方法,可能产生循环引用
_weak typeof(self) weakSelf = self; self.block = ^{ [weakSelf description]; };
-
- GCD: dispatch_async
> dispatch_async() 闭包会强引用self,但是实例化的self不会引用闭包。所以self会被释放,循环引用不会产生
> 不能使用weakSelf,对象的生命周期结束早于闭包结束,然后weakSelf会被释放