Ի՞նչ է թույլ և ուժեղ հղումների տարբերությունը։
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-ի համար, դեալոկատորները չեն կանչվի, ինչը ցույց է տալիս հիշողության լքումը։