UISwitch没有解除分配

时间:2016-09-30 17:13:00

标签: swift swift3 uiswitch persistent

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

问题:
UISwitch对象在某种程度上不会解除分配,即使没有对它进行任何操作。

项目:
只有两个视图控制器。 VC1和VC2。 VC1有一个按钮来呈现VC2。 VC2包含一个用于关闭自身的按钮以及自定义UISwitchUILabelUIStepper的属性。

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) }
}

SUBCLASSES:

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对象CustomLabels保持持久,CustomSteppyELSEIF已被解除分配。

Original state

正如Rmaddy所建议的那样,我想创建一个新问题的原因是参考计数的结果。我已经对SO进行了一些解释,但我不太确定该如何完全解决这个问题。

Reference counts (collapsed)

Reference counts

问题:
为什么这个UISwitch表现得像这样?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是(最终)在iOS 10.2中修复