Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
К счастью, сделано по уму: исключение сделано для типов значений, которые вовсе не передаются по ссылке, и если есть явное указание на тип self в замыкании, например ‘execute { [self] in’. И да, я тоже запускаю поиск по ‘self.’ для поиска утечек :)
guard let self = self else { return }
guard let self
вообще, а в некоторых случаях, когда объект и так висит в памяти от начала до конца (сразу приходят в голову только синглтоны), можно просто указать [self] in
вначале тела замыкания, и тоже сэкономить 5 символов в каждой строке. Как-то так :)[self] in вначале тела замыкания?
animations: @escaping () -> Void
наоборот не должно иметь в себе [self] in, если вызов происходит из самого View, так как это будет подвешивать его в памяти (View держит ссылку на @escaping
замыкание, а замыкание — на View. В таком случае как раз нужен [weak self] in и всё дальше как обычно.@escaping
такая ситуация встречаться не должна. @escaping
возможно, пока жив в памяти соответствующий экземпляр замыкания. Если не сохранять ссылку на замыкание специально, то на него держит сильную ссылку порождающий экземпляр класса (в данном случае View), а также может держать держать ссылку экземпляр CFRunLoopObserver (если не ошибаюсь) главного потока, в котором код выполняется асинхронно или другого потока, хотя анимация на другом потоке выполняться не должна вообще.Тут скорее про такое поведение в структурах, ибо там это не опасно.
Новая версия (SE-0279) предлагает новый синтаксис для конечных замыканий, который позволяет вызывать несколько замыканий в качестве параметров функции более читаемым способом. Это сводит к минимуму использование слишком большого количества скобок в сигнатуре функции.
load(
url: "someURL",
success: { data in },
failure: { error in }
)
load(url: "someURL")
success: { data in
}
failure: {error in
}
load(
url: "someURL"
success: { data in
}
failure: {error in
}
)
Swift 5.3: Что нового?