Είμαι στο πλαίσιο της διαδικασίας ανάπτυξης μου για τον εντοπισμό διαρροών συντριβή και τη μνήμη. Ως στρατηγική, βάζετε όλα τα μηνύματα NSLog ή ειδοποιήσεις από κάποια τέτοια μέσα didReceiveMemoryWarning:; Η τεκμηρίωση αυτής της μεθόδου είναι σχετικά αραιή. Είναι ακριβές να πούμε ότι πριν από ένα κραχ θα συμβεί, η UIViewController θα προκαλέσει αυτή τη μέθοδο; Είναι αυτό ένα σημείο εκκίνησης πριν καν πάμε μπροστά με όργανα;
iOS: εξυπηρετικότητα του didReceiveMemoryWarning:
Εντάξει, πολλά πράγματα που πρέπει να λάβετε υπόψη:
- didReceiveMemoryWarning θα κληθεί πριν από συντριβή out-of-memory. Όχι άλλα ατυχήματα. Αν χειριστείτε την προειδοποίηση σωστά και να ελευθερώσετε μνήμη, τότε μπορείτε να αποφύγετε την κατάσταση εκτός μνήμη και δεν συντριβή.
- Μπορείτε να ενεργοποιήσετε χειροκίνητα μια προειδοποίηση μνήμης στον προσομοιωτή κάτω από το μενού υλικού. Το συνιστώ ανεπιφύλακτα αυτόν τον τρόπο για να ελέγξετε το χειρισμό σας didReceiveMemoryWarning.
- Μέσα σας βοηθά να διορθώσετε τις διαρροές (αν όχι όλες) - δεν είναι πραγματικά τόσο χρήσιμο για συντριβές.
- Όχι, εγώ δεν χρησιμοποιώ προσωπικά NSLog - Απλά σημείου τύπου τις προειδοποιήσεις μνήμης όταν είμαι εντοπισμό σφαλμάτων.
Εάν ο χρήστης αφήσει κάποιες εφαρμογές ανοίξει θα έχουν πολύ μικρή μνήμη που έχετε στη διάθεση σας. Έτσι, μερικές φορές didReceiveMemoryWarningμπορεί να κληθεί από το σύστημα μόνο μετά από 1 MB χρήσης.
Το σύστημα καλεί τη μέθοδο αυτή σε όλους τους ελεγκτές άποψή σας, αν τοποθετήσετε ένα NSLog σε κάθε ένα από τους ελεγκτές άποψή σας, θα παρατηρήσετε ότι.
Στη συνέχεια, αυτόματα η μέθοδος viewDidUnloadθα κληθεί από το σύστημα για όλους τους ελεγκτές άποψή σας (όχι dealloc). Έτσι, πρέπει να βάλετε όλες τις οδηγίες ανακατανομή σας εκεί.
Θα πρέπει να κάνει πολλά πειράματα, διότι αν η εφαρμογή σας είναι συγκρότημα θα αντιμετωπίσει πολλά ατυχήματα πριν διαχείριση καλά.
ΕΝΗΜΕΡΩΣΗ
Όπως του iOS 6, UIViewControllerπροβολές δεν είναι πλέον εκφορτώνονται σε απόκριση προς προειδοποιήσεις μνήμη. Αντί απλά κάνουμε το καλύτερο για να ελευθερώσει τους πόρους που μπορεί εύλογα να δημιουργήσετε εκ νέου (π.χ. προσωρινά αποθηκευμένα δεδομένα), όταν didReceiveMemoryWarningκαλείται.
ΕΝΗΜΕΡΩΣΗ
έγραψα την αρχική απάντησή μου όταν ήμουν ένας οργισμένος νέος άνθρωπος? οι καιροί έχουν αλλάξει και ουσιαστικά, αυτό είναι λάθος.
Αν έχετε μια εφαρμογή με ένα μόνο χειριστήριο θέα και θα λάβετε μια προειδοποίηση μνήμη, δεν υπάρχουν πολλά που μπορείτε να κάνετε. Αλλά τα πράγματα αλλάζουν δραματικά αν έχετε πολλούς ελεγκτές άποψη, επειδή μπορείτε να ξεφορτώσουν όλες την κατάσταση που σχετίζεται με μη πιο μπροστά ελεγκτές. Στην πραγματικότητα, [UIViewController didReceiveMemoryWarning]θα σας prod προς τη σωστή κατεύθυνση από την εκφόρτωση μη ορατές τις απόψεις σας για σας (έκπληξη!). Όταν ο πιο μπροστά ελεγκτής άποψη αυτή απορρίφθηκε, η βασική άποψη είναι επαναφόρτωση και το πολύ ο χρήστης θα πρέπει να γνωρίζει καθυστέρηση, ακόμη και αν στο εσωτερικό η εφαρμογή σας μπορεί να κάνει μια πλήρη επανεκκίνηση μόνο.
Αυτό δεν είναι κάποια λεπτομέρεια μπορείτε εύκολα να αναβαθμιστούν, θα πρέπει να κρατήσει χρήση μνήμης στο μυαλό από την αρχή και το σχεδιασμό Multiview εφαρμογή σας σε καθαρά όπλο μη UIViewControllerκομμάτια. Στην πραγματικότητα αξίζει κρατώντας τον κωδικό σας συμβατό με τον προσομοιωτή μόνο για να χρησιμοποιήσει προειδοποιητικά μνήμη χαρακτηριστικό.
Όταν η μνήμη είναι άφθονα, τίποτα δεν είναι χωρίς φορτίο και όλα είναι μεταξένιο, και όταν η μνήμη είναι χαμηλή πράγματα συνεχίσουν να εργάζονται, αν και με βραδύτερο ρυθμό. Τώρα θα ήθελα να πω ότι αυτή η λύση στο πεπερασμένο πρόβλημα μνήμης είναι ιδανική.
Για να επωφεληθείτε από αυτή τη μνήμη αίθουσα τέχνασμα, υπερφορτώνετε τις UIViewControllerμεθόδους
viewDidLoad, viewDidUnloadκαι
viewWillUnload(iOS5, χρήσιμο αν εκφόρτωση κατάσταση απαιτεί την άποψή σας, να εξακολουθούν να υπάρχουν, για παράδειγμα, αν δεν θέλετε να διαρρεύσει υφές OpenGL σας και να καταστήσει ρυθμιστικό, σε iOS4 μπορείτε να προσομοιώσει αυτό με την υπερφόρτωση didReceiveMemoryWarningκαι την παρακολούθηση της προβολής άποψή σας).
ORIGINAL, ΠΕΡΙΣΣΟΤΕΡΑ χολερικός ΑΠΑΝΤΗΣΗ
didReceiveMemoryWarning είναι απολύτως άχρηστο.
Δεν υπάρχει καμία εγγύηση ότι αν ελευθερώσετε μνήμη (ακόμη και όλα αυτά) που δεν θα σκοτωθούμε.
Στην πικρή μου εμπειρία αυτό συνήθως λειτουργεί σαν αυτό για 2.x / 3.0:
mediaserverd διαρρέει ένα σωρό της μνήμης
app μου σκοτώνεται
Δυστυχώς, ο θεριστής ποτέ δεν σκέφτεται για τη δολοφονία mediaserverd.
Έτσι, αν η χρήση της μνήμης δεν είναι δικό σου λάθος, έχετε πραγματικά έχεις μόνο δύο επιλογές:
να ζητήσει από το χρήστη για την επανεκκίνηση (ο χρήστης θεωρεί ότι είναι δικό σου λάθος, γράφει μια καυστική κριτική)
Ελπίζουμε ο ένοχος κολλάει (mediaserverd συχνά υποχρεώνει!)
Ο σκοπός της didReceiveMemoryWarning είναι να σας δώσει την ευκαιρία να ελευθερώσετε μνήμη ή pop θέα για να αποφευχθεί η σύγκρουση. Δεν θα το λάβει σε κάθε προβλέψιμη σημείο, διότι εξαρτάται από το τι κάνει ο χρήστης. Για παράδειγμα, αν ο χρήστης ακούει στο iPod, υπάρχει λιγότερη διαθέσιμη μνήμη και θα το παραλάβει νωρίτερα.
Ο γενικός κανόνας είναι ότι πρέπει για 8MB μνήμης RAM για να εργαστεί με. Όταν φτάσετε κοντά, μπορείτε να περιμένετε το γεγονός να αυξηθεί. Αν ανάληψη τόσο πολύ μνήμη RAM σκόπιμα θα πρέπει να έχετε ένα σχέδιο για να κάνουμε κάτι για αυτό.













