这是我之前的问题的重新发布,但由于编辑太多而且我简化了我的示例,我认为如果我创建一个新问题而不是多次重新编辑问题会更清楚。
问题:
UISwitch
对象在某种程度上不会解除分配,即使没有对它进行任何操作。
项目:
只有两个视图控制器。 VC1和VC2。 VC1有一个按钮来呈现VC2。 VC2包含一个用于关闭自身的按钮以及自定义UISwitch
,UILabel
和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) }
}
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
的子类,也会发生同样的情况。
修改
我在子类中添加了deinit
,UILabel
和UIStepper
都显示了消息:
Labels has been deinitialized
Steppy has been deinitialized
所以UISwitch
似乎没有被去初始化。
截图:
在此屏幕截图中,我多次打开和关闭VC2。在那里,您可以看到只有CustomSwitch
对象CustomLabels
保持持久,CustomSteppy
和ELSEIF
已被解除分配。
正如Rmaddy所建议的那样,我想创建一个新问题的原因是参考计数的结果。我已经对SO进行了一些解释,但我不太确定该如何完全解决这个问题。
问题:
为什么这个UISwitch表现得像这样?我该如何解决这个问题?
答案 0 :(得分:0)
这是(最终)在iOS 10.2中修复