UISwitch 未解除分配
UISwitch not deallocating
这是我之前问题的重新发布,但由于编辑太多,我简化了我的示例,我认为如果我创建一个新问题而不是多次重新编辑问题会更清楚。
问题:
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) }
}
子类:
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
已经被释放,就像它应该的那样。
正如 Rmaddy 所建议的,也是我想创建一个新问题的原因是引用计数的结果。我遵循了一些关于 SO 的解释,但我不太确定如何完全理解它。
问题:
为什么这个 UISwitch 会这样,我该如何解决?
这(最终)在 iOS 10.2
中得到修复
这是我之前问题的重新发布,但由于编辑太多,我简化了我的示例,我认为如果我创建一个新问题而不是多次重新编辑问题会更清楚。
问题:
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) }
}
子类:
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
已经被释放,就像它应该的那样。
正如 Rmaddy 所建议的,也是我想创建一个新问题的原因是引用计数的结果。我遵循了一些关于 SO 的解释,但我不太确定如何完全理解它。
问题:
为什么这个 UISwitch 会这样,我该如何解决?
这(最终)在 iOS 10.2
中得到修复