Sobes.tech
Junior — Middle

Ինչպե՞ս է տեղի ունենում հիշողության ազատումը հղումային տիպով ստեղծված օբյեկտների համար։

sobes.tech AI

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

iOS-ում, ռեֆերենցիոն տիպերով (օրինակ, Swift կամ Objective-C դասեր) ստեղծված օբյեկտները կառավարվում են ավտոմատ հղման հաշվարկի համակարգով (ARC — Automatic Reference Counting): Յուրաքանչյուր օբյեկտ պահպանում է հղման հաշվիչ — ակտիվ հղումների քանակը դեպի այն: Երբ ստեղծվում է նոր հղում օբյեկտին, հաշվիչը մեծանում է, և երբ հղումը այլևս չի օգտագործվում (օրինակ, փոփոխականը դուրս է գալիս տեսադաշտից կամ նշանակվում է nil), հաշվիչը նվազում է:

Երբ օբյեկտի հղման հաշվիչը հասնում է զրոյի, դա նշանակում է, որ այլևս ոչ ոք չի հղում դեպի այն, և օբյեկտի զբաղեցրած հիշողությունը ավտոմատ կերպով ազատվում է: Սա օգնում է խուսափել հիշողության լճացումից առանց ձեռքով կառավարման:

Swift-ում օրինակ՝

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
    deinit {
        print("Անձը \(name) ազատ է արձակվել")
    }
}

var p1: Person? = Person(name: "Ivan")
var p2 = p1 // հղման հաշվիչը բարձրացել է
p1 = nil // հաշվիչը նվազել է, բայց օբյեկտը դեռ գոյություն ունի
p2 = nil // հաշվիչը հասել է 0-ի, օբյեկտը ազատ է արձակվել

Կարևոր է խուսափել ցիկլային հղումներից (retain cycles), երբ երկու օբյեկտներ միմյանց հղում են անում, ինչը խոչընդոտում է հիշողության ազատմանը: Դրա համար օգտագործվում են weak կամ unowned հղումներ: