iOS IBOutlet不为零,以某种方式被清除为零

时间:2018-11-07 19:41:59

标签: ios crash iboutlet forced-unwrapping

TL; DR:我有一个IBOutletUILabel)已正确连接到情节提要中。访问(解包)它在viewDidLoad()中工作正常……但是几秒钟后,它的值为nil。一个观察点说,出口在调用viewDidLayoutSubviews()后立即发生变化,但是... print()末尾的viewDidLayoutSubviews()调用显示其为非零

这与IBOutlet is nil非常相似,但是他的解决方案(使用didSet()的跟踪值)无效。 (有很多相关的帖子,但是都有微不足道的解决方案。)

我做了什么:

  • 将插座重新连接至标签-从两侧
  • 删除标签并重新连接
  • 清理了项目
  • 已删除DerivedData
  • 退出并重新启动Xcode
  • 退出并重新启动Mac
  • 向插座添加了didSet()方法。
    • 它在viewDidLoad()期间触发,并显示非零值。
    • viewDidLoad()中,我毫无疑问地设置了其文本值
    • 在展开nil崩溃之前,不会触发
  • 向变量添加了监视点。
    • 在崩溃前触发(在viewDidLayoutSubviews()之后并显示以下内容:

screenshot of Xcode debugger

如前所述,在监视点(viewDidLayoutSubviews())之前的最新方法调用的退出处,出口不为空。

这些崩溃似乎总是涉及特定超级视图的子视图。我在监视的出口添加了一个监视点,但是它永远不会触发。

可能是什么促使我的代码放弃了这个弱引用?

1 个答案:

答案 0 :(得分:0)

TL; DR:我正在掩盖相关观点。

嗯,找到自己答案的最好方法是问别人。感谢@DonMag,我准备了更多的跟踪,断点和屏幕截图。我注意到了这种方法(当然是为了解决另一个错误而添加的):

screen shot showing me removingFromSuperview the very views that were nil

当然,变为nil的两个视图是centralOverlay的子视图。我想保留的人。

因此,我想我的答案与IBOutlet is nil的答案类似-飞行员错误-除了didSet()处理程序不能解决这个奥秘之外。

相关问题