Swift:我不明白为什么这段代码没有内存泄漏

gorkyyrv  于 2023-03-16  发布在  Swift
关注(0)|答案(1)|浏览(188)

这段代码打印“choco的内存丢弃”作为结果。
但是我认为这段代码有内存泄漏。因为saveClosure函数指向堆栈中的let choco的名字。而Closure运行指向堆中的名字。所以let choco的引用计数为2。
同时,var run指向savaClosure。因此存在存储引用循环。但结果是激活deinit。
我错过了什么?

class Dog {
    var name = "choco"

    var run: (() -> Void)?

    func walk() {
        print("\(self.name) is running.")
    }

    func saveClosure() {

        run = {
            print("\(self.name) is running.")
        }
    }

    deinit {
        print("\(self.name)'s memory discard")
    }
}

func doSomethiing() {
    let choco: Dog? = Dog()
}

doSomething()
//choco's memory discard
class Dog {
    var name = "choco"

    var run: (() -> Void)?

    func walk() {
        print("\(self.name) is running.")
    }

    func saveClosure() {

        run = {
            print("\(self.name) is running.")
        }
    }

    deinit {
        print("\(self.name)'s memory discard")
    }
}

func doSomethiing() {
    let choco: Dog? = Dog()
}

doSomething()
// Memory Leak
xfb7svmp

xfb7svmp1#

没有内存泄漏,因为您的代码没有调用saveClosure()。这意味着run仍然是nil
如果将doSomething更改为调用saveClosure(),则会出现保留周期,不会调用deinit,也不会打印消息:

func doSomething() {
    let choco: Dog? = Dog()
    choco?.saveClosure()
}

顺便说一下,没有必要将choco设置为可选,因为它不会影响行为。

相关问题