Sobes.tech
Junior

Kāda ir atšķirība starp vājām un spēcīgām saitēm?

sobes.tech AI

Atbilde no AI

Atmiņas pārvaldības mehānisma atšķirība (ARC - Automātiskā atsauces skaitīšana):

  • Spēcīga atsauce (Strong reference): palielina objekta atsauces skaitu par 1. Objekts nevar tikt atbrīvots no atmiņas, kamēr tam ir vismaz viena spēcīga atsauce. Šī ir noklusējuma uzvedība Swift īpašībām un mainīgajiem:

  • Vāja atsauce (Weak reference): nepalielina objekta atsauces skaitu. Izmanto ciklisko atsauču novēršanai, kad divi vai vairāki objekti ir savstarpēji stipri atsaukti, radot atmiņas noplūdi. Vājas atsauces vienmēr ir opcijas (Optional), jo atsauce uz objektu var tikt dzēsta jebkurā laikā. Ja objekts ir dzēsts, vājas atsauces automātiski kļūst par nil:

Ciklo atsauču novēršanas piemērs ar vājo atsauci:

class Person {
    let name: String
    var apartment: Apartment? // sākumā stipra atsauce
    init(name: String) { self.name = name }
    deinit { print("\(name) tiek atbrīvots") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // vāja atsauce
    init(unit: String) { self.unit = unit }
    deinit { print("Dzīvoklis \(unit) tiek atbrīvots") }
}

var john: Person? // Person objekts
var unit4A: Apartment? // Apartment objekts

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Cikla atsauces veidošana:
// john ir stipra atsauce uz dzīvokli
// dzīvoklis ir stipra atsauce uz personu
john!.apartment = unit4A
unit4A!.tenant = john // tas jābūt vājam, lai pārtrauktu ciklu

john = nil // iestatot john uz nil, tas netiks atbrīvots, ja cikls pastāv
unit4A = nil // tas pats, ja cikls pastāv, tas netiks atbrīvots

// Sagaidāmais rezultāts:
// John Appleseed tiek atbrīvots
// Dzīvoklis 4A tiek atbrīvots

Ja weak netiktu izmantots tenant, deinit funkcijas netiktu izsauktas, kas norāda uz atmiņas noplūdi.