这段代码打印“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
1条答案
按热度按时间xfb7svmp1#
没有内存泄漏,因为您的代码没有调用
saveClosure()
。这意味着run
仍然是nil
。如果将
doSomething
更改为调用saveClosure()
,则会出现保留周期,不会调用deinit
,也不会打印消息:顺便说一下,没有必要将
choco
设置为可选,因为它不会影响行为。