循环引用 && weak strong

本文介绍了解决Swift语言中循环引用的方法,包括使用弱引用解决父子对象间的循环引用问题,以及如何在block和闭包中避免循环引用。还讨论了GCD在解决循环引用时的注意事项。


@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会被释放

 

转载于:https://www.cnblogs.com/HackHer/p/8151214.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值