循环引用 && 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会被释放

 

posted @ 2017-12-30 21:07  ShellHan  阅读(258)  评论(0编辑  收藏  举报