Junior — Middle
Μπορείς να καταγράψεις τους βασικούς τύπους διαρροών μνήμης που μπορεί να προκύψουν κατά τον προγραμματισμό σε Swift;
sobes.tech AI
Απάντηση από AI
Στη Swift, οι κύριοι τύποι διαρροών μνήμης σχετίζονται με κυκλικούς δεσμούς (retain cycles), που συμβαίνουν όταν τα αντικείμενα διατηρούν το ένα το άλλο, και το ARC (Automatic Reference Counting) δεν μπορεί να ελευθερώσει τη μνήμη. Οι κύριες περιπτώσεις:
- Κυκλικοί δεσμοί μεταξύ κλάσεων: δύο αντικείμενα κλάσης με ισχυρούς δεσμούς μεταξύ τους.
- Closures που καταγράφουν το self: αν ένα closure καταγράφει το self χωρίς να χρησιμοποιεί
[weak self]ή[unowned self], οδηγεί σε κύκλο. - Ισχυροί δεσμοί στους delegate: αν ο delegate δηλωθεί ως ισχυρός δεσμός και το αντικείμενο delegate αναφέρεται πίσω.
Παράδειγμα διαρροής με ένα closure:
class ViewController {
var closure: (() -> Void)?
func setup() {
closure = {
print(self) // καταγραφή του self με ισχυρό δεσμό
}
}
}
Για να το αποφύγετε, χρησιμοποιούνται ασθενείς δεσμοί:
closure = { [weak self] in
guard let self = self else { return }
print(self)
}
Έτσι, το κύριο είναι να ελέγχετε τους ισχυρούς δεσμούς και να χρησιμοποιείτε ασθενείς ή χωρίς ιδιοκτησία δεσμούς όπου χρειάζεται.