В чём разница [weak self] и [unowned self]? Когда какой?
Разница
Оба не увеличивают strong-счётчик self и тем самым разрывают цикл «объект хранит замыкание, замыкание держит объект». Отличаются поведением, когда self уже умер:
[weak self]—selfвнутри становитсяOptional; после деаллокации читается какnil. Безопасно всегда, цена —guard let selfи чуть более дорогое чтение (side table).[unowned self]—selfне опционален; обращение после деаллокации — детерминированный трап «Attempted to read an unowned reference but object was already deallocated». Дешевле (счётчик в объекте, без side table), но это обещание компилятору: «self точно жив».
final class ViewModel {
var title = ""
var onChange: (() -> Void)?
func bind(label: UILabel) {
onChange = { [weak self] in
guard let self else { return } // замыкание переживёт self? → weak
label.text = self.title
}
}
}
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep