Sobes.tech
Middle

Kaip vyksta iOS kūrimo metu steko valymas?

sobes.tech AI

Atsakymas iš AI

iOS iškvietimų stekas automatiškai išvalomas funkcijos ar metodo pabaigoje. Kai funkcija baigiasi, jos rėmas (vietinių kintamųjų, argumentų ir grąžinimo adreso rinkinys) pašalinamas iš steko.

Objektai, esantys steke (pvz., struktūros ar paprasti duomenų tipai), valymas vyksta tiesiogiai pašalinus rėmą.

Objektai, esantys krūvoje (heap), ir į kuriuos nuorodos saugomos steke, automatinio atminties valdymo sistema iOS (ARC - Automatic Reference Counting) vaidina svarbų vaidmenį. ARC nesurenka steko, bet valdo objektų gyvavimo laiką krūvoje.

Kai kintamasis, turintis stiprią nuorodą į krūvoje esantį objektą, išeina iš matomumo srities (tai įvyksta užbaigus funkcijos rėmą), ARC automatiškai sumažina šio objekto nuorodų skaitiklį. Jei skaitiklis pasiekia nulį, ARC atlaisvina atmintį, užimamą objektu krūvoje.

Taigi, steko valymas yra tiesioginis rėmų pašalinimas funkcijų pabaigoje, o atminties atlaisvinimas krūvoje, į kurią nuorodos buvo saugomos steke, vyksta netiesiogiai per ARC.

Pavyzdys:

struct MyStruct {
    let value: Int
}

class MyClass {
    var name: String

    init(name: String) {
        self.name = name
        print("MyClass instance \(name) sukurtas")
    }

    deinit {
        print("MyClass instance \(name) atlaisvintas")
    }
}

func myFunction() {
    let stackStruct = MyStruct(value: 10) // Padėtas į steką
    let heapObject = MyClass(name: "Example") // Padėtas į krūvą, nuoroda steke

    // ... dirbame su stackStruct ir heapObject

    // Funkcija baigiasi, stackStruct ir nuoroda į heapObject pašalinamos iš steko
    // ARC sumažina heapObject nuorodų skaitiklį. Jei 0, objektas atlaisvinamas.
}

myFunction() // Kviesime funkciją

Šiame pavyzdyje:

  • stackStruct yra tiesiogiai padėtas į steką myFunction funkcijos rėme. Kai myFunction baigiasi, rėmas pašalinamas, ir stackStruct automatiškai išvalomas.
  • heapObject yra nuoroda į MyClass egzempliorių, kuris yra heap'e. Pats kintamasis heapObject (nuoroda) yra steke. Kai myFunction baigiasi, nuoroda heapObject pašalinama iš steko. Kadangi tai buvo vienintelė stipri nuoroda į `MyClass(