Sobes.tech
Middle

Πώς γίνεται ο καθαρισμός της στοίβας στην ανάπτυξη iOS;

sobes.tech AI

Απάντηση από AI

Η στοίβα κλήσεων σε iOS καθαρίζεται αυτόματα όταν ολοκληρώνεται η εκτέλεση μιας συνάρτησης ή μεθόδου. Όταν μια συνάρτηση τελειώνει, το πλαίσιο της (σύνολο τοπικών μεταβλητών, επιχειρημάτων και διεύθυνσης επιστροφής) διαγράφεται από τη στοίβα.

Για αντικείμενα που αποθηκεύονται στη στοίβα (π.χ. δομές ή απλοί τύποι δεδομένων), ο καθαρισμός γίνεται άμεσα κατά τη διαγραφή του πλαισίου.

Για αντικείμενα που αποθηκεύονται στον σωρό (heap), και αναφέρονται από τη στοίβα, η αυτόματη διαχείριση μνήμης σε iOS (ARC - Αυτόματη Αριθμοδότηση Αναφορών) παίζει σημαντικό ρόλο. Το ARC δεν καθαρίζει τη στοίβα, αλλά διαχειρίζεται τη διάρκεια ζωής των αντικειμένων στον σωρό.

Όταν μια μεταβλητή που περιέχει μια ισχυρή αναφορά σε ένα αντικείμενο στον σωρό βγει από το πεδίο ορατότητας (που συμβαίνει κατά τη διαγραφή του πλαισίου από τη στοίβα), το ARC μειώνει αυτόματα τον μετρητή αναφορών αυτού του αντικειμένου. Αν ο μετρητής φτάσει στο μηδέν, το ARC ελευθερώνει τη μνήμη που καταλαμβάνει το αντικείμενο στον σωρό.

Έτσι, ο καθαρισμός της στοίβας είναι η άμεση διαγραφή των πλαισίων κατά το τέλος των συναρτήσεων, και η απελευθέρωση μνήμης για αντικείμενα στον σωρό, στα οποία αναφέρονται οι μεταβλητές στη στοίβα, γίνεται έμμεσα μέσω του ARC.

Παράδειγμα:

struct MyStruct {
    let value: Int
}

class MyClass {
    var name: String

    init(name: String) {
        self.name = name
        print("Αντικείμενο MyClass \(name) δημιουργήθηκε")
    }

    deinit {
        print("Αντικείμενο MyClass \(name) απελευθερώθηκε")
    }
}

func myFunction() {
    let stackStruct = MyStruct(value: 10) // Τοποθετείται στη στοίβα
    let heapObject = MyClass(name: "Παράδειγμα") // Τοποθετείται στον σωρό, αναφορά στη στοίβα

    // ... εργαζόμαστε με stackStruct και heapObject

    // Η συνάρτηση ολοκληρώνεται, τα πλαίσια του stackStruct και η αναφορά στο heapObject διαγράφονται από τη στοίβα
    // Το ARC μειώνει τον μετρητή αναφορών του heapObject. Αν φτάσει στο μηδέν, το αντικείμενο απελευθερώνεται.
}

myFunction() // Κλήση της συνάρτησης

Σε αυτό το παράδειγμα:

  • Το stackStruct αποθηκεύεται άμεσα στη στοίβα μέσα στο πλαίσιο της myFunction. Όταν η myFunction τελειώνει, το πλαίσιο διαγράφεται και το stackStruct καθαρίζεται αυτόματα.
  • Το heapObject είναι μια αναφορά σε ένα στιγμιότυπο της MyClass, το οποίο βρίσκεται στον σωρό. Η μεταβλητή heapObject (η αναφορά) βρίσκεται στη στοίβα. Όταν η myFunction τελειώνει, η αναφορά heapObject διαγράφεται από τη στοίβα. Δεδομένου ότι αυτή ήταν η μοναδική ισχυρή αναφορά στο στιγμιότυπο MyClass("Παράδειγμα"), το ARC ανιχνεύει ότι ο μετρητής αναφορών είναι μηδέν και καλεί το deinit, ελευθερώνοντας τη μνήμη στον σωρό.