Почему я получаю фатальную ошибку 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)

Похоже, что сборщик мусора видит его как не имеющий ссылки и освобождает его. Несмотря на то, что это исправлено, я хотел бы лучше понять основные быстрые и базовые поведения, которые приводят к этому. Буду признателен за чей-либо опыт в этой области.

Снимок экрана в xcode

0 ответов

Другие вопросы по тегам