Sobes.tech
Junior — Middle

Είναι δυνατή η υλοποίηση μιας αδύναμης αναφοράς σε ένα αντικείμενο πίνακα;

sobes.tech AI

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

Στο iOS (Objective-C ή Swift), οι αδύναμοι αναφορές (weak) εφαρμόζονται συνήθως σε αντικείμενα για να αποφευχθούν κύκλοι διατήρησης και διαρροές μνήμης. Ωστόσο, οι πίνακες (NSArray, NSMutableArray ή Array στο Swift) αποθηκεύουν προεπιλεγμένα ισχυρές αναφορές στα στοιχεία τους.

Για την υλοποίηση ενός πίνακα με αδύναμες αναφορές, μπορούν να χρησιμοποιηθούν εξειδικευμένοι κοντέινερ, όπως το NSPointerArray με την επιλογή αδύναμων αναφορών. Το NSPointerArray επιτρέπει την αποθήκευση αδύναμων αναφορών σε αντικείμενα και τα διαγράφει αυτόματα όταν το αντικείμενο απελευθερώνεται.

Παράδειγμα σε Objective-C:

NSPointerArray *weakArray = [NSPointerArray weakObjectsPointerArray];

NSObject *obj = [[NSObject alloc] init];
[weakArray addPointer:(__bridge void * _Nullable)(obj)];

// Όταν το obj απελευθερώνεται, το weakArray θα ενημερωθεί αυτόματα

Στο Swift, μπορείτε να τυλίξετε αντικείμενα σε αδύναμα κοντέινερ ή να χρησιμοποιήσετε το NSPointerArray μέσω γέφυρας:

let weakArray = NSPointerArray.weakObjects()
let obj = NSObject()
weakArray.addPointer(Unmanaged.passUnretained(obj).toOpaque())

Έτσι, δεν υπάρχει άμεση αδύναμη αναφορά σε μια κανονική array, αλλά μπορείτε να χρησιμοποιήσετε το NSPointerArray ή να δημιουργήσετε δικές σας δομές με αδύναμες αναφορές.