Sobes.tech
Middle

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 автоматтык түрдө тазаланады.
  • heapObjectMyClass экземплярына шилтеме, ал heapте жайгашкан. Өзү — heapObject өзгөрмөсү (шилтеме) стекте. myFunction аяктагандан кийин, heapObject шилтемеси стектен алынып салынат. Бул — MyClass("Example") экземплярындагы жалгыз күчтүү шилтеме болгондуктан, ARC шилтемелер санын 0 деп аныктайт жана deinit чакырып, жадыны бошотот.