gpt4 book ai didi

swift - UISwitch 未解除分配

转载 作者:行者123 更新时间:2023-11-28 08:26:41 25 4
gpt4 key购买 nike

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

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


项目:
只有两个 View Controller 。 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 进行子类化,也会发生同样的情况。

编辑:
我在子类中添加了一个 deinit 并且 UILabelUIStepper 都显示了消息:

Labels has been deinitialized
Steppy has been deinitialized

因此 UISwitch 似乎没有被取消初始化。

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

Original state

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

Reference counts (collapsed)

Reference counts


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

最佳答案

这(最终)在 iOS 10.2 中得到修复

关于swift - UISwitch 未解除分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39796709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com