Ρύθμιση ενός αντικειμένου μηδενική έναντι + realloc απελευθέρωση

ψήφοι
9

Αυτό δεν είναι σκουπίδια συλλέγονται περιβάλλον

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

Υποθετικά μιλώντας, τι κι αν έχω μια NSMutableArrayή NSMutableDictionary, θα ήταν πιο αποτελεσματικό να κάνουμε κάτι, όπως:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

ή απλά,

myArr = nil;

Θα myArr αφήστε το αντικείμενο και με αφήνει χωρίς δείκτη για την αποθήκευση στη μνήμη ώστε να μπορώ να την επαναχρησιμοποίηση myArr;

Δημοσιεύθηκε 09/03/2009 στις 17:03
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
21

Αν το κάνετε myArr=nil;από μόνη της, τότε έχετε χάσει το δείκτη στον οποίο μπορείτε να στείλετε το releaseμήνυμα. Δεν υπάρχει μαγικό να releaseτο αντικείμενό σας.

Και, όπως λέει ο Georg, χωρίς να είναι σε θέση να απελευθερώσει το αντικείμενό σας, ότι η μνήμη έχει «διαρρεύσει».

Απαντήθηκε 09/03/2009 στις 17:07
πηγή χρήστη

ψήφοι
6

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

Χρησιμοποιήστε την ακόλουθη σύνταξη για να δηλώσει την συστοιχία

@property (readwrite, retain) NSMutableArray *myArray;

Στη συνέχεια, εκ νέου αρχικοποίηση όπως αυτό:

[self setMyArray:[NSMutableArray array]];
Απαντήθηκε 09/03/2009 στις 17:59
πηγή χρήστη

ψήφοι
5

Αν ήταν στο Mac OS, δεν το iPhone OS θα έλεγα ότι εξαρτάται από το αν ο συλλέκτης σκουπιδιών είναι ενεργοποιημένη ή όχι:

  • με GC: χρήση myArr = nil;
  • χωρίς GC: χρήση [myArr release];

Δυστυχώς, για το iPhone, δεν υπάρχει καμία συλλογή των απορριμμάτων, οπότε αν δεν θέλετε διαρροές μνήμης, θα πρέπει να απελευθερώσει το αντικείμενό σας από τη στιγμή που το χρειάζεστε πια.

Απαντήθηκε 09/03/2009 στις 17:13
πηγή χρήστη

ψήφοι
4

Το πρώτο μπλοκ κώδικας είναι λεπτή. Ωστόσο, η δεύτερη κατηγορία δεν σας αφήσει με μια σειρά που μπορείτε να χρησιμοποιήσετε, ώστε να μην είναι επαρκής. Μισό διόρθωση αυτή μπλοκ, νομίζω ότι εννοείτε:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Ωστόσο, αυτό δεν επιτύχει ό, τι θέλετε, είτε γιατί δεν απελευθερώνουν myArr. Αν έχετε συντίθεται ένα ρυθμιστή για myArr, τότε μπορείτε να πάρετε τη συμπεριφορά απελευθέρωσης που θέλετε από τη ρύθμιση στο μηδέν, χρησιμοποιώντας το ρυθμιστή (self.myArr) αντί για την πρόσβαση στο δείκτη άμεσα (myArr). Διόρθωση πλήρως δεύτερη ομάδα σας:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Τώρα έχουμε ισοδύναμο παραδείγματα κώδικα, η πρώτη με setter με μηδέν για την απελευθέρωση, το άλλο όχι. Ειναι ιδιοι.

Εάν myArr είναι ευμετάβλητος γεννήτρια, όπως σε αυτά τα παραδείγματα, η πιο αποτελεσματική μέθοδος είναι η χρήση removeAllObjects, αποφεύγοντας όλη τη δουλειά της απελευθέρωσης μνήμης μόνο για να ζητήσει την επιστροφή:

[myArr removeAllObjects];
Απαντήθηκε 02/12/2009 στις 11:08
πηγή χρήστη

ψήφοι
1

Αν αυτό που θέλετε είναι να επαναφέρετε τα περιεχόμενα ενός NSMutableArray / NSMutableDictionary, μπορείτε επίσης να καλέσετε removeAllObjects και έχετε μια νέα σειρά / dict να εργαστεί με.

Απαντήθηκε 13/03/2009 στις 22:37
πηγή χρήστη

ψήφοι
1

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

«Η απελευθέρωση του αντικειμένου» δεν είναι «τίποτα», γι 'αυτό δεν το κάνει αυτό. :) Σε μια συλλογή απορριφθέντων στοιχείων γλώσσα θα μπορούσε να το κάνει αυτό ως παρενέργεια της εγκατάλειψης την αναφορά, αλλά Στόχος C δεν λειτουργεί με αυτόν τον τρόπο.

Απαντήθηκε 09/03/2009 στις 17:09
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more