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 оны анықтап, deinit шақырып, жадыны босатады.