Sobes.tech
Middle

Kuidas toimub mälu haldamine Swiftis viidetüüpide jaoks?

sobes.tech AI

Vastus AI-lt

Swiftis toimub mäluhaldus viidetüüpi (klasside) jaoks automaatse viidete arvutamise (ARC, Automatic Reference Counting) abil. Iga objekt mälujärjekorras hoiab viidete loendurit: aktiivsete viidete arvu sellele objektile. Kui luuakse uus viide objekti juurde, suureneb loendur, ja kui viide lõpetab kasutamise, väheneb see. Kui loendur jõuab nulli, eemaldatakse objekt automaatselt mälust.

Näide:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var a: Person? = Person(name: "Alice") // loendur = 1
var b = a                             // loendur = 2
b = nil                              // loendur = 1
a = nil                              // loendur = 0, objekt eemaldatakse

Oluline on vältida tsüklilisi viiteid (retain cycles), kus kaks objekti viitavad üksteisele, mis takistab mälu vabastamist. Selleks kasutatakse nõrku (weak) ja omandamata (unowned) viiteid.

Väärtusetüübid (struktuurid, enumeratsioonid) salvestatakse virnale ja kopeeritakse määramisel, seega ARC nendele ei kehti.