UISwitch 未解除分配

UISwitch not deallocating

这是我之前问题的重新发布,但由于编辑太多,我简化了我的示例,我认为如果我创建一个新问题而不是多次重新编辑问题会更清楚。

问题:
UISwitch 即使没有对它进行任何操作,对象也不会以某种方式解除分配。


项目:
只有两个视图控制器。 VC1 和 VC2。 VC1 有一个按钮来显示 VC2。 VC2 包含一个用于关闭自身的按钮和一个自定义 UISwitchUILabel 的 属性 和一个 UIStepper.

VC1:

class VC1: UIViewController {

    let button = UIButton()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(button)

        button.addTarget(self, action: #selector(open), for: .touchUpInside)

        // Some auto layout (not relevant to the question)
    }

    func open() { present(VC2(), animated: true) }
}

VC2:

class VC2: UIViewController {

    let button = UIButton()

    let shifty = CustomSwitch()    // Note: nothing has been done with this
    let labels = CustomLabels()
    let steppy = CustomSteppy()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(button)

        button.addTarget(self, action: #selector(close), for: .touchUpInside)

        // Some auto layout (not relevant to the question)
    }

    func close() { dismiss(animated: true) }
}

子类:

class CustomSwitch: UISwitch  { deinit { print("Switch has been deinitialized") } }
class CustomLabels: UILabel   { deinit { print("Labels has been deinitialized") } }
class CustomSteppy: UIStepper { deinit { print("Steppy has been deinitialized") } }

我创建这些子类的唯一原因是我可以在探查器中更轻松地跟踪它们。即使我不子类 UISwitch.

也会发生同样的情况

编辑:
我在子类中添加了 deinitUILabelUIStepper 都显示了消息:

Labels has been deinitialized
Steppy has been deinitialized

所以 UISwitch 似乎没有被取消初始化。

屏幕截图:
在此屏幕截图中,我多次打开和关闭 VC2。在那里你可以看到只有对象 CustomSwitch 保持持久,而 CustomLabelsCustomSteppy 已经被释放,就像它应该的那样。

正如 Rmaddy 所建议的,也是我想创建一个新问题的原因是引用计数的结果。我遵循了一些关于 SO 的解释,但我不太确定如何完全理解它。


问题:
为什么这个 UISwitch 会这样,我该如何解决?

这(最终)在 iOS 10.2

中得到修复