Ios 为什么在未首先将自定义UIControl分配给局部变量的情况下将其分配给成员变量时会出现致命的零错误?

Ios 为什么在未首先将自定义UIControl分配给局部变量的情况下将其分配给成员变量时会出现致命的零错误?,ios,swift,null,uicontrol,Ios,Swift,Null,Uicontrol,我在UIToolbar中有一个自定义控件。工具栏是子类化的,它将控件作为成员变量保存 var segmentCtl:VGSegment! 当工具栏初始化时,它将创建控件,如下所示: let categoryCtl = VGSegment(frame: placeholder.frame, segmentConfiguration: config, titles: titles) categoryCtl.delegate = delegate let tbButton = UIBarButt

我在UIToolbar中有一个自定义控件。工具栏是子类化的,它将控件作为成员变量保存

var segmentCtl:VGSegment!
当工具栏初始化时,它将创建控件,如下所示:

let categoryCtl = VGSegment(frame: placeholder.frame, segmentConfiguration: config, titles: titles)

categoryCtl.delegate = delegate

let tbButton = UIBarButtonItem(customView: categoryCtl)
items?.remove(at: 0)
items?.insert(tbButton, at: 0)
let segment = VGSegment(frame: placeholder.frame, segmentConfiguration: config, titles: titles)

segment.delegate = delegate

categoryCtl = segment

let tbButton = UIBarButtonItem(customView: segment)
items?.remove(at: 0)
items?.insert(tbButton, at: 0)
这一切都可以正常工作,并且在变量categoryCtl具有有效值的情况下退出。稍后,当访问变量时,我得到了致命的nil错误

我可以通过为控件创建使用局部变量,然后将其指定为成员变量来纠正这个问题。代码如下:

let categoryCtl = VGSegment(frame: placeholder.frame, segmentConfiguration: config, titles: titles)

categoryCtl.delegate = delegate

let tbButton = UIBarButtonItem(customView: categoryCtl)
items?.remove(at: 0)
items?.insert(tbButton, at: 0)
let segment = VGSegment(frame: placeholder.frame, segmentConfiguration: config, titles: titles)

segment.delegate = delegate

categoryCtl = segment

let tbButton = UIBarButtonItem(customView: segment)
items?.remove(at: 0)
items?.insert(tbButton, at: 0)
垃圾收集器似乎将其视为未引用,并将其释放。虽然它是固定的,但我希望更好地理解导致这种情况的潜在swift和框架行为。我非常感谢任何人在这方面的专业知识


在这两种情况下,您都在创建局部变量。在第一种情况下,您从不将本地属性指定给属性,因此属性为零。在这两种情况下,请删除“段”前面的“let”。这就是为什么我强烈建议您在引用属性时养成使用
self.
的习惯,尽管在中这样做通常是可选的Swift@dan很好的观察。这是我为这篇文章复制代码时犯的一个错误。我通过释放来纠正它,在声明之后,当它分配代理时,我立即得到相同的零问题。对所有赋值和读取使用self.categoryCtl也会导致nil致命错误?