闭包的循环引用问题

示例代码:
import UIKit

class ViewController: UIViewController {

    // 定义闭包
    var callback:(()->())?

    override func viewDidLoad() {
        super.viewDidLoad()
        // 闭包实现
        callback = {
            print(weakSelf?.view)
        }
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        // 执行闭包
        callback?()
    }

    deinit{
        print("ViewController再见")
    }

}
分析:
当前控制器 强引用了闭包
闭包强引用self
A -> B  B -> A
解决循环引用:
  • 方法01(仿照OC的写法) (等同于OC中 __weak)
        weak var weakSelf = self
        
        callback = {
            print(weakSelf?.view)
        }
  • 方法02 (等同于OC中 __weak) (iOS时间- 5.0) 推荐方式
        callback = {[weak self] in
            print(self?.view)
        }
  • 方法03 (等同于OC中 __unsafe_unretained)(iOS时间- 4.0)
    缺点:self不是可选项,如果self已经被释放,则出现野指针访问
        callback = {[unowned self] in
            print(self.view)
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容