Junior — Middle
Όταν καταγράφετε μια μεταβλητή μέσα σε ένα κλείσιμο, πού αποθηκεύεται — στη στοίβα ή στο σωρό;
sobes.tech AI
Απάντηση από AI
Όταν μια μεταβλητή καταγράφεται μέσα σε ένα κλείσιμο σε iOS (για παράδειγμα, σε Swift ή Objective-C), η μεταβλητή αποθηκεύεται συνήθως στο σωρό.
Αυτό συμβαίνει επειδή ένα κλείσιμο μπορεί να ζήσει περισσότερο από το πλαίσιο της στοίβας στο οποίο δημιουργήθηκε η μεταβλητή. Για να διατηρηθεί η πρόσβαση σε αυτήν τη μεταβλητή μετά την έξοδο από τη λειτουργία, ο μεταγλωττιστής την εκχωρεί στο σωρό και το κλείσιμο περιέχει μια αναφορά σε αυτή.
Παράδειγμα σε Swift:
func makeIncrementer() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let increment = makeIncrementer()
print(increment()) // 1
print(increment()) // 2
Εδώ, το count καταγράφεται από το κλείσιμο και αποθηκεύεται στο σωρό για να διατηρεί την κατάσταση μεταξύ των κλήσεων.
Έτσι, οι μεταβλητές που καταγράφονται από κλεισίματα τοποθετούνται στο σωρό για να διασφαλιστεί ο κύκλος ζωής τους, που υπερβαίνει το στοίβα.