Sobes.tech
Junior — Middle

Kaip vyksta atminties išlaisvinimas naudojant nuorodų tipą sukurtiems objektams?

sobes.tech AI

Atsakymas iš AI

iOS, objektai, sukurti naudojant nuorodų tipus (pavyzdžiui, Swift ar Objective-C klases), valdomi automatinio nuorodų skaičiavimo (ARC — Automatic Reference Counting) sistemos. Kiekvienas objektas saugo nuorodų skaitiklį — aktyvių nuorodų į jį skaičių. Kai sukuriama nauja nuoroda į objektą, skaitiklis padidėja, o kai nuoroda nebenaudojama (pavyzdžiui, kintamasis išeina iš apimties arba jam priskiriama nil), skaitiklis sumažėja.

Kai objekto nuorodų skaitiklis pasiekia nulį, tai reiškia, kad į jį nebežvelgia niekas, ir atmintis, kurią užima objektas, automatiškai atlaisvinama. Tai padeda išvengti atminties nutekėjimo be rankinio valdymo.

Swift pavyzdys:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
    deinit {
        print("Asmuo \(name) atlaisvintas")
    }
}

var p1: Person? = Person(name: "Ivan")
var p2 = p1 // nuorodų skaitiklis padidėjo
p1 = nil // skaitiklis sumažėjo, bet objektas vis dar gyvas
p2 = nil // skaitiklis pasiekė 0, objektas atlaisvintas

Svarbu išvengti ciklinių nuorodų (retain cycles), kai du objektai vienas kitą nurodo, kas trukdo atlaisvinti atmintį. Tam naudojamos weak arba unowned nuorodos.