【发布时间】:2019-10-07 04:38:07
【问题描述】:
我有一个非常简单的代码。我有意与委托人创建一个内存循环。尝试观察和学习如何使用 Xcode 的 Memory Graph。
我不明白为什么在连接部分,Xcode 说有 3 个连接。应该只有 2 个。
如果我创建一个带有闭包的内存循环,那么它将显示 2 个连接。
我的委托泄露代码:
protocol SomeDelegate {
func didFinishSomething()
}
class Something {
var delegate: SomeDelegate?
}
class ViewController: UIViewController, SomeDelegate {
var x = Something()
override func viewDidLoad() {
super.viewDidLoad()
print("view did load")
x.delegate = self
}
func didFinishSomething() {
print("something was finished")
}
deinit {
print("dellocated!!!")
}
}
我将该视图推送到导航控制器中,然后返回。
这 2 个委托对象的内存地址略有不同,仅相差 +16
这似乎与委托对象作为协议有关。因为当我删除协议时,它减少到 2:
class Something2 {
var delegate: ViewController?
}
class ViewController: UIViewController {
var x = Something2()
override func viewDidLoad() {
super.viewDidLoad()
print("view did load")
x.delegate = self
}
deinit {
print("dellocated!!!")
}
}
【问题讨论】:
-
我很确定 Xcode 只是混淆了——使用协议值不应该导致任何额外的保留,它应该像普通的强引用一样执行保留。
-
这似乎是让 Xcode 困惑的可选性 - 尝试使用 gist.github.com/hamishknight/26edbfd8531c9c3c49391cfb44c4d9c7,内存图现在正确显示 2 个连接。
-
谢谢。我用了你的代码。将
var delegate: SomeDelegate更改为var delegate: SomeDelegate?,然后显示2。这仍然是您的预期吗?如果它是可选的,那么我想它应该回到 3... -
嗯,我想这不是可选性,必须是其他一些因素。有趣的是,在命令行项目中运行的最小化示例中,分配的顺序似乎会影响结果:gist.github.com/hamishknight/52c616c7402df2cf23fa781aea19e590。无论根本原因是什么,我认为 Xcode 有问题,而不是 Swift。
-
哈!你能把你的sn-ps放在答案中吗?以为我们还没有得出结论,有时答案是“它有问题”
标签: swift memory-management memory-leaks protocols