【问题标题】:UISwitch deinit never calledUISwitch deinit 从未调用过
【发布时间】:2016-10-02 14:53:36
【问题描述】:

几天前我发布了一个问题here,但我仍然没有找到答案。我认为这是一个错误,希望将来能修复它,但不禁认为这也可能是我自己做错的事情。

有了这个问题,我希望能够确认这是一个错误,这样我就可以继续处理我的项目而不必担心太多。如果这个问题是重复的,我会马上删除这个问题。

我已将UISwitch 子类化并添加了deinit,因此我可以看到它何时被释放。

class CustomSwitch: UISwitch { deinit {print("Switch has been deinitialized")} }

然后我在视图控制器中添加了一个属性:

var customSwitch: CustomSwitch? = CustomSwitch()

为了测试它,我添加了一个具有以下功能的按钮:

func removeSwitch() {
    print(customSwitch)
    customSwitch = nil
    print(customSwitch)
}

在控制台中打印出以下内容:

Optional(<Debugging.CustomSwitch: 0x7f9ec91083c0; baseClass = UISwitch; frame = (0 0; 51 31); layer = <CALayer: 0x6100000384a0>>)
nil

deinit 消息未打印,在仪器中显示 customSwitch 仍在内存中。

我唯一能找到的就是this

【问题讨论】:

  • 只有我一个人遇到这种情况?
  • 开关是否被添加到视图中?如果是这样,视图将保留它,它不会耗尽内存。如果你这样做,你应该立即得到一个 deinit: weak var customSwitch: CustomSwitch? = CustomSwitch() 因为它没有强引用。
  • 不,它没有被添加到视图中。就算有,也应该没关系。这是一个已知错误,因为我的错误报告已被标记为重复。

标签: ios swift uiswitch


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据Apple Docs,我认为我们不能手动取消初始化。它说Deinitializers are called automatically, just before instance deallocation takes place. You are not allowed to call a deinitializer yourself.

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 2016-01-17
      • 2021-10-22
      • 2018-05-24
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2015-11-24
      • 2020-08-12
      相关资源
      最近更新 更多