繁体   English   中英

这种关闭是否会导致内存泄漏?

[英]Will this closure cause a memory leak?

我知道以下内容会导致内存泄漏,因为MyClassmyClosure引用。

var MyClass {
    var myVar = 0
    let myClosure: (Int) -> Void

    init() {
        self.myClosure = { x in
            self.myVar = x
        }
    }
}

以下是否会导致内存泄漏? 为什么或者为什么不?

var MyClass {
    var myVar = 0

    function myFunc() {
        let myClosure = { x in
            self.myVar = x
        }

        myClosure(0)
    }
}

不,这将(实际上)不会导致内存泄漏。 myClosure()myFunc()定义为local。 myClosure(0)被调用时,闭包将被安排执行,一旦完成,它将被删除内存。

你的代码唯一的问题是,在你的闭包内部, self是一个强引用,可能在执行闭包时被释放。 这将导致错误的超额错误。 确保你创建了一个对self的弱引用,并在你的闭包中使用它。

声明弱自我以避免内存泄漏并保护自己以避免调用释放的自我

func myFunc() {
    let myClosure = { [weak self] x in
        guard let strongSelf = self else {
            return
        }

        strongSelf.myVar = x
    }

    myClosure(0)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM