Junior — Middle
Можеш ли да изброиш основните видове течове на памет, които могат да възникнат при програмиране на Swift?
sobes.tech AI
Отговор от AI
В Swift основните видове течове на памет са свързани с циклични препратки (retain cycles), които възникват, когато обектите държат един друг, и ARC (Automatic Reference Counting) не може да освободи паметта. Основните случаи:
- Циклични препратки между класове: два обекта на клас с силни препратки един към друг.
- Затваряния, които улавят self: ако затваряне улавя self без да използва
[weak self]или[unowned self], това води до цикъл. - Силни препратки в делегати: ако делегатът е обявен като силна препратка, а обектът делегат се отнася обратно.
Пример за теч с затваряне:
class ViewController {
var closure: (() -> Void)?
func setup() {
closure = {
print(self) // улавяне на self със силна препратка
}
}
}
За да се избегне това, се използват слаби препратки:
closure = { [weak self] in
guard let self = self else { return }
print(self)
}
Така, основното е да се контролира силните препратки и да се използват слаби или безвладетелски препратки там, където е необходимо.