Sobes.tech
Middle

Ինչպես է տեղի ունենում iOS զարգացման ժամանակ ստեկի մաքրման գործընթացը։

sobes.tech AI

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

iOS- ում կանչերի պատը ավտոմատ կերպով մաքրվում է ֆունկցիայի կամ մեթոդի ավարտին։ Երբ ֆունկցիան ավարտվում է, նրա ֆրեյմը (տեղական փոփոխականների հավաքածու, արգումենտներ և վերադարձման հասցե) հեռացվում է ստեկից։

Տեղական ստեկում գտնվող օբյեկտների համար (օրինակ, կառուցվածքներ կամ պարզ տվյալների տիպեր), մաքրման գործընթացը տեղի է ունենում անմիջապես ֆրեյմի հեռացման ժամանակ։

Համարած, օբյեկտների համար, որոնք տեղադրված են հողատարածքում (համարած, հողամասում), և որոնց վրա հղումներ պահվում են ստեկում, ավտոմատ հիշողության կառավարումը iOS-ում (ARC - Automatic Reference Counting) կարևոր դեր է խաղում։ ARC-ը չի մաքրում ստեկը, բայց կառավարում է հողատարածքում գտնվող օբյեկտների կյանքի տևողությունը։

Երբ փոփոխականը, որը պարունակում է ուժեղ հղում հողատարածքում գտնվող օբյեկտին, դուրս է գալիս տեսանելիությունից (որը տեղի է ունենում ֆունկցիայի ավարտին ֆրեյմի հեռացման ժամանակ), ARC-ը ավտոմատ կերպով նվազեցնում է այդ օբյեկտի հղումների հաշվիչը։ Եթե հաշվիչը դառնում է զրո, ARC-ը ազատում է հողատարածքում գտնվող օբյեկտի համար հիշողությունը։

Այսպիսով, ստեկի մաքրման գործընթացը ուղղակիորեն կապված է ֆրեյմների հեռացման հետ, իսկ հողատարածքում գտնվող օբյեկտների հիշողության ազատումը կատարվում է ARC-ի միջոցով։

Օրինակ՝

struct MyStruct {
    let value: Int
}

class MyClass {
    var name: String

    init(name: String) {
        self.name = name
        print("MyClass instance \(name) ստեղծվեց")
    }

    deinit {
        print("MyClass instance \(name) ազատվեց")
    }
}

func myFunction() {
    let stackStruct = MyStruct(value: 10) // Տեղադրված է ստեկում
    let heapObject = MyClass(name: "Example") // Տեղադրված է հողատարածքում, հղում ստեկում

    // ... աշխատում ենք stackStruct և heapObject-ով

    // Ֆունկցիան ավարտվում է, stackStruct և հղումը heapObject-ին հեռացվում են ստեկից
    // ARC-ը նվազեցնում է heapObject-ի հղումների հաշվիչը։ Եթե զրո է, օբյեկտը ազատվում է։
}

myFunction() // Կոչում ենք ֆունկցիան

Այս օրինակով՝

  • stackStruct տեղադրված է ուղղակիորեն ստեկում myFunction ֆրեյմի մեջ։ Երբ myFunction ավարտվում է, ֆրեյմը հեռացվում է, և stackStruct-ը ավտոմատ կերպով մաքրվում է։
  • heapObject-ը հղում է MyClass-ի օրինակին, որը գտնվում է հողատարածքում։ Ինքը՝ heapObject փոփոխականը (հղումը), գտնվում է ստեկում։ Երբ myFunction ավարտվում է, heapObject-ի հղումը հեռացվում է ստեկից։ Քանի որ դա եղել է միակ ուժեղ հղումը MyClass("Example")-ի օրինակին, ARC-ը որոշում է, որ հղումների հաշվիչը 0 է և կանչում է deinit, ազատելով հիշողությունը հողատարածքում։