码迷,mamicode.com
首页 > 其他好文 > 详细

循环引用 && weak strong

时间:2017-12-30 22:36:31      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:queue   实例化   lis   一个   name   val   self   不能   pre   


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

 

循环引用 && weak strong

标签:queue   实例化   lis   一个   name   val   self   不能   pre   

原文地址:https://www.cnblogs.com/HackHer/p/8151214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!