Sobes.tech
Middle

Kuidas toimub iOS arenduses virna puhastamine?

sobes.tech AI

Vastus AI-lt

iOS-teenus kutsed järk automaatselt puhastatakse, kui funktsioon või meetod lõppeb. Kui funktsioon lõpeb, eemaldatakse selle raam (paiksete muutujate, argumentide ja tagasipöördumise aadressi kogum) virnast.

Virnast paiknevad objektid (näiteks struktuurid või lihtsad andmetüübid) puhastatakse otse raamest eemaldamisega.

Heap-ile (kõrvale) paigutatud ja virnas hoitavad viited objektidele mängivad iOS-is (ARC - Automatic Reference Counting) olulist rolli. ARC ei puhasta virna, kuid haldab heap-ile paigutatud objektide eluea aega.

Kui muutuja, mis sisaldab tugevat viidet heap-ile paigutatud objekti, väljub nähtavuspiirkonnast (mis juhtub, kui eemaldatakse funktsiooni raam virnast), vähendab ARC automaatselt selle objekti viidete arvu. Kui viidete arv jõuab nullini, vabastab ARC mälu, mida objekt heap-ile hõivab.

Seega on virna puhastamine otsene raamide eemaldamine funktsioonide lõppedes, kuid mälu vabastamine heap-ile viitavatest objektidest toimub kaudselt ARC kaudu.

Näide:

struct MyStruct {
    let value: Int
}

class MyClass {
    var name: String

    init(name: String) {
        self.name = name
        print("MyClass'i eksemplar \(name) loodud")
    }

    deinit {
        print("MyClass'i eksemplar \(name) vabastatud")
    }
}

func myFunction() {
    let stackStruct = MyStruct(value: 10) // Paigutatud virnale
    let heapObject = MyClass(name: "Example") // Paigutatud virnale, viide virnas

    // ... töötame koos stackStruct ja heapObject

    // Funktsioon lõppeb, stackStruct ja viide heapObject eemaldatakse virnast
    // ARC vähendab heapObject viidete arvu. Kui see on 0, objekt vabastatakse.
}

myFunction() // Funktsiooni kutsumine

Selles näites:

  • stackStruct paikneb otse virnas myFunction raames. Kui myFunction lõppeb, eemaldatakse raam ja stackStruct puhastatakse automaatselt.
  • heapObject on viide MyClass eksemplarile, mis asub heap-ile. Enda muutujana heapObject (viide) asub virnas. Kui myFunction lõppeb, eemaldatakse heapObject viide virnast. Kuna see oli ainus tugev viide MyClass("Example") eksemplarile, tuvastab ARC, et viidete arv on 0 ja kutsub deinit, vabastades mälu heap-ilt.