Sobes.tech
Intern

Ի՞նչ է աղբահանության հավաքողը (garbage collector):

sobes.tech AI

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

iOS-ում ավանդական աղբահավաք չկա: Դրա փոխարեն օգտագործվում է Automatic Reference Counting (ARC) մեխանիզմը:

  • Ավтоматիկ մեխանիզմ: ARC ավտոմատ կերպով հաշվում է ուժեղ հղումները օբյեկտների վրա:
  • Հիշողության ազատում: Երբ օբյեկտի ուժեղ հղումների քանակը հասնում է զրոյի, ARC ազատում է տրամադրված հիշողությունը:
  • Ավտո կանխարգելում: Ճիշտ օգտագործումը ուժեղ, թույլ և անտեր հղումների թույլ է տալիս կանխել հիշողության արտահոսքը և ուժեղ հղումների ցիկլերը:

ARC-ի հղումների տեսակները:

  • ուժեղ (strong): Հավելում է հղումների հաշվիչը։ Դեպքում՝ ըստ նախնական կարգավորումների:
  • թույլ (weak): Չավելացնում է հղումների հաշվիչը։ Ավտոմատ կերպով դառնում է nil օբյեկտի dealloc-ի ժամանակ։ Օգտագործվում է ցիկլերը կանխելու համար։ Հայտարարում է որպես ընտրական տիպ:
  • անտեր (unowned): Չավելացնում է հղումների հաշվիչը։ Գаранտի է, որ այն օբյեկտը, որի վրա հղում է, գոյություն ունի ամբողջ կյանքի ընթացքում։ Չի հանդիսանում որպես ընտրական։ Օգտագործվում է, երբ երկու օբյեկտներ ունեն փոխադարձ ուժեղ կապ, բայց մեկը՝ կարճաժամկետ կյանքով:

ARC-ի առավելությունները:

  • Նպատկում: Հիշողության ազատումը տեղի է ունենում որոշակի, երբ օբյեկտը այլևս չի օգտագործվում:
  • Արդյունավետություն: Չկա ֆոնային աղբահավաքի լրացուցիչ ծախս, որը կարող է առաջացնել կանգառներ:
  • Պարզություն: Ծրագրավորողը պետք է հասկանի հղումների հաշվարկման սկզբունքները՝ կանխելու համար արտահոսքերը:

Օրինակ ուժեղ հղումների ցիկլի:

class Person {
    let name: String
    var apartment: Apartment? // ուժեղ հղում՝ դեպի Apartment

    init(name: String) { self.name = name }
    deinit { print("\(name) դեակտիվացվեց") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // թույլ հղում՝ դեպի Person՝ ցիկլը կանխելու համար

    init(unit: String) { self.unit = unit }
    deinit { print("Apartment \(unit) դեակտիվացվեց") }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john // Օգտագործում է weak, սա շատ կարևոր է

john = nil
unit4A = nil
// Անվճար tenant-ով՝ երկու օբյեկտներն էլ չեն դեակտիվացվի
// Weak tenant-ով՝ երկու օբյեկտներն էլ դեակտիվացվում են ճիշտ