iOS өнүктүрүүдө стекти тазалоо кандай болот?
sobes.tech AI
AIден жооп
iOSтогу чакырулардын такталышы автоматтык түрдө функция же методту аяктагандан кийин тазаланып калат. Функция аяктагандан кийин, анын фрейми (локалдык өзгөрмөлөрдүн, аргументтердин жана кайтаруу дарегинин топтому) стектен алынып салынат.
Стекке жайгаштырылган объекттер үчүн (мисалы, структуралар же жөнөкөй маалымат түрлөрү), тазалоо түз эле фрейм алынып салынган учурда жүргүзүлөт.
Heapке жайгаштырылган жана стекке сакталган шилтемелер менен иштеген объекттер үчүн, iOSтогу автоматтык эс тутумду башкаруу (ARC - Automatic Reference Counting) маанилүү роль ойнойт. ARC стекти тазалабайт, бирок heapтеги объекттердин жашоо мөөнөтүн башкарат.
Stackке жогорку шилтемеси бар объекттин өзгөрмөсү көрүнүү чегинен чыгып калганда (бул myFunction аяктагандан кийин стектен фрейм алынып салынганда болот), ARC автоматтык түрдө ошол объекттин шилтемелер санын азайтат. Эгер шилтемелер саны нөлгө барабар болсо, ARC heapтеги объектти бошотот.
Демек, стекти тазалоо — бул функциялар аяктагандан кийин фреймдердин түздөн-түз жоголушу, ал эми heapтеги объекттер үчүн эс тутумду бошотуу космостук жол менен, 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") // Heapке жайгаштырылган, стекке шилтеме
// ... иштөө stackStruct жана heapObject менен
// Функция аяктап, stackStruct жана heapObjectке шилтемелер алынып салынат
// ARC heapObjectтин шилтемелер санын азайтат. Эгер нөл болсо, объект бошотулат.
}
myFunction() // Функцияны чакырабыз
Бул мисалда:
stackStructтике элеmyFunctionфрейминде стекке жайгаштырылган.myFunctionаяктагандан кийин, фрейм алынып салынат жанаstackStructавтоматтык түрдө тазаланады.heapObject—MyClassэкземплярына шилтеме, ал heapте жайгашкан. Өзү —heapObjectөзгөрмөсү (шилтеме) стекте.myFunctionаяктагандан кийин,heapObjectшилтемеси стектен алынып салынат. Бул —MyClass("Example")экземплярындагы жалгыз күчтүү шилтеме болгондуктан, ARC шилтемелер санын 0 деп аныктайт жанаdeinitчакырып, жадыны бошотот.