Sobes.tech
Junior — Middle

Μπορείς να δώσεις ένα παράδειγμα πότε σε ένα κλείσιμο (closure) στη Swift χρειάζεται να χρησιμοποιήσεις weak self για την αποφυγή κυκλικών αναφορών;

sobes.tech AI

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

Στα Swift, μια κυκλική αναφορά συμβαίνει όταν ένα αντικείμενο καταγράφει μια αναφορά στον εαυτό του σε μια κλείσιμο, και αυτό το κλείσιμο αποθηκεύεται στο ίδιο αντικείμενο, οδηγώντας σε αμοιβαία διατήρηση και διαρροή μνήμης. Για να το αποφύγετε, χρησιμοποιείτε το weak self.

Παράδειγμα: έχετε μια κλάση ViewController που ξεκινά μια ασύγχρονη λειτουργία με ένα κλείσιμο. Αν στο κλείσιμο χρησιμοποιήσετε άμεσα το self, τότε το ViewController θα διατηρείται από το κλείσιμο και δεν θα απελευθερωθεί μετά το κλείσιμο.

class ViewController: UIViewController {
    func fetchData() {
        networkRequest { [weak self] data in
            guard let self = self else { return }
            self.updateUI(with: data)
        }
    }

    func updateUI(with data: Data) {
        // ενημέρωση διεπαφής
    }
}

Εδώ, το weak self αποτρέπει μια ισχυρή κυκλική αναφορά, καθώς το κλείσιμο καταγράφει το self ασθενώς και δεν διατηρεί το αντικείμενο, επιτρέποντάς του να απελευθερωθεί.