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.