Основные риски — неизвестная очередь callback, удержание контроллера и неясное время жизни сервиса. titleLabel здесь устанавливается до чтения, поэтому nil не гарантирован.
Обнаружьте ошибки в представленном Swift‑фрагменте
Основные риски — неизвестная очередь callback, удержание контроллера и неясное время жизни сервиса. titleLabel здесь устанавливается до чтения, поэтому nil не гарантирован.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В приведённом ниже примере класса‑контроллера есть несколько потенциальных проблем, связанных с использованием необязательных свойств и замыканиями. Найдите и опишите их.
class SomeViewController: UIViewController {
private var titleLabel: UILabel!
func printText(text: String) {
Logging.log(text)
titleLabel = createLabelAndConfigure()
}
func createLabelAndConfigure() -> UILabel {
// считаем, что метод реализован
}
func performAction() {
let service = SomeNetworkService()
service.downloadObject { text in
self.printText(text: text)
self.titleLabel.text = text
}
}
}
Ответ
Основные риски — неизвестная очередь callback, удержание контроллера и неясное время жизни сервиса. titleLabel здесь устанавливается до чтения, поэтому nil не гарантирован.
Если completion приходит не на main thread, присваивание label и изменение его текста нужно перенести на главный actor/очередь. Захват self сильный; это может продлевать жизнь контроллера, но цикл удержания нельзя утверждать без реализации сервиса и его ссылок. Аналогично локальный service может отмениться при освобождении либо удерживаться задачей — контракт не показан. Label лучше создать один раз при настройке интерфейса. Показанный createLabelAndConfigure — оговорённая заглушка, а не основание игнорировать остальной анализ.