循环引用 && weak strong

Posted Shell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环引用 && 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会被释放

 

以上是关于循环引用 && weak strong的主要内容,如果未能解决你的问题,请参考以下文章

rust循环引用问题

C++ shared_ptr&&weak_ptr的简单介绍和仿写

swift进阶七:引用计数(Strong、Unowned、Weak)

iOS之weak和strong懒加载及循环引用

weak引用变量是否线程安全

使用weak strong dance 解决 block 循环引用