Ios 添加子视图时内存泄漏

Ios 添加子视图时内存泄漏,ios,memory-leaks,Ios,Memory Leaks,添加子视图时,视图控制器似乎泄漏 为什么下面打印“什么” import UIKit final class ViewController: UIViewController { private lazy var mySwitch: UISwitch = { let mySwitch = UISwitch() mySwitch.tintColor = .blue return mySwitch }() func setu

添加子视图时,视图控制器似乎泄漏

为什么下面打印“什么”

import UIKit

final class ViewController: UIViewController {

    private lazy var mySwitch: UISwitch = {
        let mySwitch = UISwitch()
        mySwitch.tintColor = .blue
        return mySwitch
    }()

    func setup() {
        view.addSubview(mySwitch)
    }

    @objc func switchChangedState() {

    }

    deinit {
        print("what")
    }
}

var controller: ViewController? = ViewController()
controller = nil
但以下情况并非如此

var controller: ViewController? = ViewController()
controller?.setup()
controller = nil
编辑:添加GIF


Xcode 9.4.1版(9F2000)

您的代码很好<代码>控制器?.setup()不会导致泄漏。请确保测试用例2中的代码是否被真正调用。(不呼叫,不打印什么)

您的代码没有问题。这里没有保留循环

问题似乎与操场有关。这可能是一个bug,或者游乐场出于某种原因保留了视图控制器

如果在实际的Xcode项目中(在iOS模拟器或设备上)执行代码,则在两种情况下都会执行初始值设定项:


为什么是决赛?嗨@TomSchulz。我写期末考是出于习惯。在这个特殊的例子中,它是不需要的。尽管如此,我还是建议作为一种习惯添加final,直到您准备好支持子类化。不同意。无论如何,你都不能发送头文件和库。如果有人希望事情不是最终的,他们只需要编辑你的代码支持子类化';该语言支持子类化。@TomSchulz我不明白“发送头文件和库”或“编辑代码”是什么意思。@TomSchulz如果您还没有准备好支持子类化,我建议添加final。当然,你和其他人可以在未来改变这一点,这就是想法。当您准备好子类化时更改它。此外,添加final是性能改进。我支持这个-这里没有保留循环。当我构建并运行您的代码时,在这两种情况下都会调用deinitializer。我同意,代码明确表明这里没有保留周期,但我看到的行为表明不是这样。已经添加了一个gif来演示。嗨@YunCHEN已经添加了gif来发布。@Jonesy这与操场有关,你的代码一点问题也没有。也许这是一个错误,或者也许操场出于某种原因保留了你的控制器。如果您在实际的Xcode项目中运行完全相同的代码,那么deinitializer肯定会在这两种情况下运行:Thank@PeteMorris将接受您的正式回答