Sobes.tech
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)
}

Така, основното е да се контролира силните препратки и да се използват слаби или безвладетелски препратки там, където е необходимо.