美文网首页
Swift中closure的循环引用记录

Swift中closure的循环引用记录

作者: Codepgq | 来源:发表于2019-04-27 10:23 被阅读0次

1、定义一个controller: TestController并添加如下代码

class TestController: UIViewController {
    
    typealias TestClosure = () -> ()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
    }

    deinit {
        print(self, #function)
    }
    
    // MARK: - private property
    private var name: String = "sdf"
    private var closure: TestClosure?
}



然后添加方法进行测试:

  • 1
func test() {
        
        let closure: TestClosure = {
            self.name = ""
        }
        
        closure()
    }

不会循环引用

 closure引用了name,但是 self 没有引用closure,
 不构成互相强引用的关系
  • 2
    func test2() {
        
        let closure: TestClosure = {
            self.name = ""
        }
        
        closure()
        self.closure = closure
    }

closure引用了name,self 也引用closure,
构成互相强引用的关系
  • 3
    func test3() {
        
        let closure: TestClosure = {[weak self] in
            
            let closure1: TestClosure = {
                self?.name = "dddd"
            }
            closure1()
        }
        
        closure()
        self.closure = closure
    }

不会

closure中使用了[weak self] 修饰,所以在整个closure中的self都是弱引用,
虽然在closure1中并没有用[weak self]关键字,但是他此时调用的self是closure中的弱引用self
所以没有构成循环引用
  • 4
    func test4() {
        
        let closure: TestClosure = {
            
            let closure1: TestClosure = { [weak self] in
                self?.name = "dddd"
            }
            closure1()
        }
        
        closure()
        self.closure = closure
    }

closure中并没有使用了[weak self] 修饰,所以在整个closure中的self都是强引用,
虽然在closure1中并有用[weak self]关键字,但是他此时调用的self是closure中的强引用self
所以有构成循环引用

结论:

如果在closure引用了self.但是self不引用closure,此时不会发生循环引用
如果self还引用了closure,这个时候就需要[weak self] 或者 [unowned self] 去修饰
如果有多层的closure嵌套,要在最外层的closure中修饰self,否则会发生循环引用

相关文章

  • Swift中closure的循环引用记录

    1、定义一个controller: TestController并添加如下代码 然后添加方法进行测试: 1 不会循...

  • unowned 和 weak 的小事儿

    自从接触了swift 之后,Closure 算是用的最多的东西了,为了避免循环引用,一直喜欢在Closure里面 ...

  • Swift闭包循环引用

    无论OC中的Block还是Swift中的闭包Closure,经常因为使用不当从而造成循环引用从而导致内存泄漏,如何...

  • Swift--内存管理

    Swift内存管理概述 强引用循环 打破强引用循环 闭包中的强引用循环 Swift内存管理概述 Swift中的AR...

  • swift - 闭包基础

    闭包 closure 闭包在Swift中应用广泛,在许多系统库方法中都能看到。 无名本质是函数使用时注意循环引用 ...

  • 在closure中处理循环引用

    Swift是一们安全的语言,对于Objective-C中经常出现的block引起的循环引用问题处理的更好,在clo...

  • Swift 循环引用

    Swift 循环引用 [TOC] 前言 本本主要研究的是Swift中闭包捕获外部变量时产生的循环引用。全部示例是在...

  • iOS内存管理

    swift 中如何解决循环引用 解决类之间的循环引用 weak:弱引用, 必须为变量(var),可选类型(?),指...

  • 关于Swift闭包的循环引用问题

    由Swift ARC内存管理以及循环引用可以得出Swift闭包中的循环引用问题,然后我写了另外一个demo去验证这...

  • Swift之循环引用

    Swift中的循环引用是怎么样的呢?我们来看看: 调用: 这样是不会引起循环引用的,为什么呢? 要循环引用还要se...

网友评论

      本文标题:Swift中closure的循环引用记录

      本文链接:https://www.haomeiwen.com/subject/dkyhnqtx.html