Что выведет код 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 ошибок.
Предыдущий вопрос
Что выведет Swift: владелец и слабая обратная ссылка
Следующий вопрос
Как хранятся weak-ссылки в Swift
Ещё по теме «ARC и циклы ссылок»
- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Почему делегат объявляют weak
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок