Встречается на 27% собеседований по Mobile

Расскажи про capture list

capture list используется в замыканиях (closures) для управления тем, как замыкание захватывает переменные и константы из окружающего контекста. Могут захватывать и хранить ссылки на любые константы и переменные из контекста, в котором они определены. Это удобно, но может привести к сильным ссылочным циклам и утечкам памяти, если замыкание захватывает `self` или другие экземпляры класса.

Как он работает

Предоставляет способ определить правила захвата переменных в замыкании. Она задаётся в начале замыкания и позволяет избежать нежелательных сильных ссылок, особенно при работе с `self` в методах класса, что очень важно для предотвращения утечек памяти в приложениях.

Синтаксис Capture List

text
```swift
{ [capture rule] (parameters) -> return type in
    // Код замыкания
}
```

Пример с простым замыканием:

text
```swift
var a = 0
var b = 0
let closure = { [a] in
    print(a, b)
}

a = 10
b = 10
closure()  // Выведет "0 10"
```

В этом примере, `a` захватывается как константа, а `b` захватывается как обычная переменная. Изменения в `a` вне замыкания не повлияют на захваченное значение внутри замыкания, в то время как изменения `b` будут видны при вызове замыкания.

Использование Capture List для предотвращения сильных ссылочных циклов

text
```swift
class MyClass {
    var property = "Property"

    func doSomething() {
        let closure = { [weak self] in
            print(self?.property ?? "нет self")
        }
        closure()
    }

    deinit {
        print("MyClass экземпляр был деинициализирован")
    }
}
```

В этом примере, `self` захватывается как `weak`, что означает, что замыкание не увеличит счётчик ссылок для `self` и позволит объекту класса корректно деинициализироваться, даже если замыкание ещё существует.

Зачем они нужны

Обеспечивает более тонкий контроль над тем, как замыкания захватывают и управляют переменными, помогая управлять памятью эффективно и предотвращая утечки памяти, особенно в комплексных захватах, связанных с `self` в классах.

Capture list позволяет задавать правила захвата переменных в замыканиях, помогая контролировать использование памяти и предотвращать утечки памяти, когда вы работаете с `self` или другими переменными, которые могут создавать сильные ссылочные циклы. Это как решение сохранить книгу в библиотеке слабо привязанной, чтобы её можно было легко удалить, когда она больше не нужна.

April 23, 2024, easyoffer

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы