Sobes.tech
Junior — Middle

Kā notiek atmiņas atbrīvošana objektiem ar cikliskām atsaucēm pārvaldītās vidēs?

sobes.tech AI

Atbilde no AI

Vadības vidēs, piemēram, iOS ar ARC (Automātiska atsauču skaitīšana), cikliskas atsauces objektiem tiek atbrīvotas neautomātiski, jo ARC nevar pārtraukt atsauces ciklus.

Lai atrisinātu šo problēmu, tiek izmantotas vājās (weak) un bez īpašnieka (unowned) atsauces, kas nepalielina objekta atsauču skaitītāju. Tas ļauj pārtraukt ciklus un pareizi atbrīvot atmiņu.

Piemērs:

class Person {
    var name: String
    weak var apartment: Apartment? // vāja atsauce

    init(name: String) {
        self.name = name
    }
}

class Apartment {
    let unit: String
    unowned let tenant: Person // bez īpašnieka atsauce

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
    }
}

Šeit, Person un Apartment atsaucas viens uz otru, bet viena no atsaucēm ir vāja, kas novērš atmiņas noplūdi.

Ja atsauces cikli netiek pārtraukti, objekti paliks atmiņā, neskatoties uz ārējām atsaucēm, kas novedīs pie atmiņas noplūdes.