Sobes.tech
Junior — Middle

Kas saaks loetleda Swiftis programmeerimisel tekkida võivaid peamisi mälulekke tüüpe?

sobes.tech AI

Vastus AI-lt

Swiftis on peamised mälulekke tüübid seotud tsükliliste viidetega (retain cycles), mis tekivad, kui objektid hoiavad üksteist, ning ARC (Automatic Reference Counting) ei saa mälu vabastada. Peamised juhtumid:

  • Tsüklilised viited klasside vahel: kaks klassi objekti, millel on tugevad viited üksteisele.
  • Sulud, mis haaravad self: kui sulg haarab self ilma [weak self] või [unowned self] kasutamata, põhjustab see tsükli.
  • Tugevad viited delegaatides: kui delegaat on määratletud tugevana ja objekt viitab sellele tagasi.

Näide lekkest suluga:

class ViewController {
    var closure: (() -> Void)?

    func setup() {
        closure = {
            print(self) // haarab self tugeva viitega
        }
    }
}

Vältimiseks kasutatakse nõrku viiteid:

closure = { [weak self] in
    guard let self = self else { return }
    print(self)
}

Peamine on kontrollida tugevaid viiteid ja kasutada nõrku või omandamata viiteid seal, kus see on vajalik.