Sobes.tech
Junior

Ի՞նչ է թույլ և ուժեղ հղումների տարբերությունը։

sobes.tech AI

Պատասխան AI-ից

Հիշողության կառավարման մեխանիզմի տարբերություն (ARC - Ավտոմատ Ռեֆերանս Հաշվարկ):

  • Հզոր հղում (Strong reference): բարձրացնում է օբյեկտի հղումների հաշվիչը 1-ով: Օբյեկտը չի կարող ազատվել հիշողությունից, քանի դեռ դրա վրա կա առնվազն մեկ հզոր հղում: Սա է Swift-ի հատկությունների և փոփոխականների նախնական վարքագիծը:

  • Ազատ հղում (Weak reference): չի բարձրացնում օբյեկտի հղումների հաշվիչը: Օգտագործվում է ցիկլային հղումների կանխարգելման համար, երբ երկու կամ ավելի օբյեկտներ ունեն միմյանց հզոր հղումներ, ստեղծելով հիշողության լքման վտանգ: Ազատ հղումները միշտ օպցիոնալ են (Optional), քանի որ հղվող օբյեկտը կարող է ցանկացած ժամանակ դեալոկացվել: Եթե օբյեկտը ազատվել է, ազատ հղումը ավտոմատ կերպով դառնում է nil:

Նմուշ ցիկլային հղման և դրա կանխարգելման՝ օգտագործելով ազատ հղում:

class Person {
    let name: String
    var apartment: Apartment? // սկզբում հզոր հղում
    init(name: String) { self.name = name }
    deinit { print("\(name) հանվել է") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // ազատ հղում
    init(unit: String) { self.unit = unit }
    deinit { print("Բնակարան \(unit) հանվել է") }
}

var john: Person? // Person օբյեկտ
var unit4A: Apartment? // Apartment օբյեկտ

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

// Ցիկլային հղման ստեղծում՝
// john ունի հզոր հղում բնակարանին
// բնակարանն ունի հզոր հղում անձին
john!.apartment = unit4A
unit4A!.tenant = john // սա պետք է լինի ազատ հղում՝ ցիկլը խափանելու համար

john = nil // john-ին նշանակելով nil՝ այն չի ազատվի, եթե ցիկլ կա
unit4A = nil // նույնը՝ եթե ցիկլ կա, չի ազատվի

// Ապագա ելք՝ օգտագործելով ազատ հղում՝
// John Appleseed հանվում է
// Բնակարան 4A հանվում է

Եթե weak չլիներ tenant-ի համար, դեալոկատորները չեն կանչվի, ինչը ցույց է տալիս հիշողության լքումը։