Ինչպես է տեղի ունենում 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, ազատելով հիշողությունը հողատարածքում։