最近在学习swift,学习到闭包的时候,了解到跟OC中的block是一个东西,既然是一个东西,那肯定会存在循环引用的问题,所以找了点资料总结了一下block和闭包的循环引用的解决办法,记录一下。
在OC中 有两种方法来解决block的循环引用
方法一
__weak typeof(self) weekSelf = self;(打断循环引用链条)
用这种方法 对象释放后,weakSelf会自动置为nil
方法二
__unsafe_unretained typeof(self) weakSelf = self;
同方法一不同,当对象释放后,不会将weakSelf指向nil 而是会指向一块废弃的存储空间(即野指针)
在swift中也有两种方法,同OC一样,只不过写法不一样
第一种的写法为
weak var weakSelf = self
当对象释放以后,weakSelf会自动变成nil,因为weakSelf可能为空,所以在swift中,他是一个可选项
第二种的写法为
unowned var weakSelf = self
在swift中,还有一种方法焦作捕获列表,就是在调用闭包的时候,在形参前面通过[]指定捕获对象,写法如下
circleBlock = {
[unowned self]
() ->() in
self.view.backgroundColor = UIColor.red;
}