Что выведет код Middle ARC и циклы ссылок обновлено

Что выведет Swift: замыкание с weak self после освобождения

Вопрос

Что выведет код?

final class Screen {
    let name = "Profile"
    var onTap: (() -> Void)?
    func setup() {
        onTap = { [weak self] in print(self?.name ?? "nil") }
    }
    deinit { print("deinit Screen") }
}

var screen: Screen? = Screen()
screen!.setup()
let handler = screen!.onTap!
handler()
screen = nil
handler()

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: Profile, deinit Screen, nil. Замыкание держит self слабо, поэтому цикла нет и screen = nil освобождает объект, хотя само замыкание ещё живо в handler.

Что выведет

Profile
deinit Screen
nil

Разбор

Замыкание держит self слабо, поэтому цикла нет и screen = nil освобождает объект, хотя само замыкание ещё живо в handler. Второй вызов видит self == nil.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.