Middle
Ποια είναι η διαφορά μεταξύ του συλλέκτη απορριμμάτων (garbage collector) και της αυτόματης διαχείρισης μνήμης (ARC);
sobes.tech AI
Απάντηση από AI
Ο συλλέκτης απορριμμάτων βρίσκει και ελευθερώνει αυτόματα τη μνήμη που δεν χρησιμοποιείται πλέον από το πρόγραμμα. Λειτουργεί στο παρασκήνιο, σαρώνοντας περιοδικά το σωρό και εντοπίζοντας αντικείμενα στα οποία δεν υπάρχουν ενεργές αναφορές.
Το ARC (Αυτόματη Μέτρηση Αναφορών) στη Swift και Objective-C διαχειρίζεται τη ζωή των αντικειμένων μετρώντας τον αριθμό των ισχυρών αναφορών σε κάθε αντικείμενο. Μόλις ο αριθμός των ισχυρών αναφορών ενός αντικειμένου φτάσει το μηδέν, το ARC ελευθερώνει αυτόματα τη μνήμη που καταλαμβάνει αυτό το αντικείμενο.
Βασικές διαφορές:
| Χαρακτηριστικό | Συλλέκτης απορριμμάτων | ARC |
|---|---|---|
| Αρχή λειτουργίας | Αναζήτηση μη προσβάσιμων αντικειμένων | Μέτρηση ισχυρών αναφορών |
| Στιγμή απελευθέρωσης | Μη προκαθορισμένη, κατά το σάρωση | Προκαθορισμένη, όταν ο μετρητής φτάσει το 0 |
| Πρόσθετα έξοδα | Πάυσεις στην εκτέλεση του προγράμματος (κατά τη συλλογή) | Ελάχιστα, κατά την αλλαγή του μετρητή |
| Προβλεψιμότητα | Χαμηλή | Υψηλή |
| Κυκλικές αναφορές | Απαιτούν ειδικές προσεγγίσεις (π.χ., αδύναμες αναφορές) | Απαιτούν τη χρήση weak ή unowned αναφορών |
| Χρήση σε iOS | Απουσιάζει σε σύγχρονο Objective-C και Swift | Κύριος μηχανισμός διαχείρισης μνήμης σε Objective-C και Swift |
Παράδειγμα χρήσης του weak για την αποτροπή κυκλικών ισχυρών αναφορών στο ARC:
class Person {
let name: String
var apartment: Apartment? // ισχυρή αναφορά
init(name: String) {
self.name = name
print("\(name) αρχίζει την κατασκευή")
}
deinit {
print("\(name) τελειώνει την κατασκευή")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // αδύναμη αναφορά
init(unit: String) {
self.unit = unit
print("Διαμέρισμα \(unit) αρχίζει την κατασκευή")
}
deinit {
print("Διαμέρισμα \(unit) τελειώνει την κατασκευή")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // αδύναμη αναφορά αποτρέπει τον κύκλο διατήρησης
john = nil // Το αντικείμενο Person διαγράφεται
unit4A = nil // Το αντικείμενο Apartment διαγράφεται