Почему я получаю фатальную ошибку nil при назначении пользовательского UIControl переменной-члену без предварительного назначения его локальной переменной?
У меня есть пользовательский элемент управления в 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)
Это все работает нормально и завершается с переменной categoryCtl, имеющей допустимое значение. Некоторое время спустя, когда к переменной обращаются, я получаю фатальную ошибку ноль.
Я могу исправить это, используя локальную переменную для создания элемента управления, а затем назначив ему переменную-член. Код выглядит следующим образом:
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)
Похоже, что сборщик мусора видит его как не имеющий ссылки и освобождает его. Несмотря на то, что это исправлено, я хотел бы лучше понять основные быстрые и базовые поведения, которые приводят к этому. Буду признателен за чей-либо опыт в этой области.