Sobes.tech
Junior — Middle

Можеш ли да набројиш главне врсте цурења меморије која могу настати при програмирању у Swift-у?

sobes.tech АИ

Одговор од АИ

У 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)
}

Стога, главно је контролисати јаке референце и користити слабе или безвласничке референце тамо где је то потребно.