Junior — Middle
Πώς και σε ποιες περιπτώσεις χρησιμοποιούνται αδύναμες αναφορές μέσα σε κλεισίματα;
sobes.tech AI
Απάντηση από AI
Στο iOS, κατά την εργασία με closures, συχνά προκύπτει το πρόβλημα των κυκλικών αναφορών, όταν ένα αντικείμενο καταγράφει το closure και το closure καταγράφει το αντικείμενο, οδηγώντας σε διαρροές μνήμης. Για να το αποφύγετε αυτό, χρησιμοποιούνται ασθενείς αναφορές (weak references) μέσα στα closures.
Μια ασθενής αναφορά δεν αυξάνει τον μετρητή αναφορών του αντικειμένου, έτσι ώστε αν δεν υπάρχουν ισχυρές αναφορές, το αντικείμενο μπορεί να απελευθερωθεί.
Παράδειγμα χρήσης μιας ασθενούς αναφοράς μέσα σε ένα closure:
class ViewController {
var completionHandler: (() -> Void)?
func setup() {
completionHandler = { [weak self] in
guard let self = self else { return }
self.doSomething()
}
}
func doSomething() {
print("Ενέργεια εκτελέστηκε")
}
}
Περιπτώσεις χρήσης:
- Όταν το closure καταγράφει το self ή άλλα αντικείμενα για να αποφύγει τον κύκλο διατήρησης.
- Σε ασύγχρονες λειτουργίες, όπου το αντικείμενο μπορεί να καταστραφεί πριν την εκτέλεση του closure.
Η χρήση ασθενών αναφορών βοηθά στη διαχείριση της μνήμης και στην πρόληψη διαρροών.