iOS: disponibilità del didReceiveMemoryWarning:

voti
12

Sono al parte del mio processo di sviluppo per rintracciare le perdite che si infrangono e di memoria. Come strategia, si fa a mettere qualsiasi messaggio NSLog o notifiche di qualcosa del genere in didReceiveMemoryWarning:? La documentazione per questo metodo è piuttosto scarsa. E 'corretto dire che prima di un crash accadrà, l'UIViewController attiverà quel metodo? È un punto di partenza, prima ancora di andare avanti con strumenti?

È pubblicato 24/02/2009 alle 17:15
fonte dall'utente
In altre lingue...                            


4 risposte

voti
28

OK, parecchie cose da notare:

  • didReceiveMemoryWarning sarà chiamato prima di un incidente out-of-memoria. Non altri incidenti. Se si gestisce l'avviso correttamente e liberare la memoria, allora si può evitare la condizione out-of-memoria e non bloccarsi.
  • È possibile attivare manualmente un avviso di memoria nel simulatore sotto il menu Hardware. Consiglio vivamente di fare questo per testare la movimentazione di didReceiveMemoryWarning.
  • Strumenti aiuta a eseguire il debug di perdite (anche se non tutti) - non è poi così utile per crash.
  • No, io non uso personalmente NSLog - ho solo breakpoint gli avvisi di memoria quando sono di debug.
Risposto il 24/02/2009 a 18:20
fonte dall'utente

voti
5

Se l'utente ha lasciato alcune applicazioni aprire avrete poca memoria a disposizione. Così a volte didReceiveMemoryWarningpuò essere chiamato dal sistema solo dopo 1 MB di utilizzo.

Il sistema chiama questo metodo su tutti i controller di vista, se si inserisce un NSLog in ciascuno dei vostri controller di vista, si noterà che.

Quindi automaticamente il metodo viewDidUnloadverrà chiamato dal sistema su tutti i controller di vista (non dealloc). Quindi devi mettere tutte le istruzioni deallocazione in là.

Devi fare un sacco di esperimenti, perché se la vostra applicazione è complessa si faccia sacco di incidenti prima di riuscire bene.

Risposto il 22/09/2011 a 08:00
fonte dall'utente

voti
4

AGGIORNAMENTO Come di iOS 6, UIViewControllervista non sono più scaricata in risposta ad avvisi di memoria. Invece solo fare del tuo meglio per liberare tutte le risorse che si può ragionevolmente ricreare (ad esempio, i dati memorizzati nella cache), quando didReceiveMemoryWarningviene chiamato.

UPDATE
Ho scritto la mia risposta originale quando ero un giovane arrabbiato; i tempi sono cambiati e in fondo, è sbagliato.

Se si dispone di un app con un solo controller della vista e si riceve un avviso di memoria, non c'è molto che si può fare. Ma le cose cambiano drasticamente se si dispone di più controller di vista, perché si può scaricare tutto lo stato associato con i controllori non in primo piano. In realtà [UIViewController didReceiveMemoryWarning]vi prod nella direzione giusta scaricando le vostre opinioni non visibili per voi (sorpresa!). Quando il controller della vista in primo piano è respinta, la vista sottostante viene ricaricato e al massimo l'utente dovrebbe essere solo a conoscenza di un ritardo, anche se internamente la vostra applicazione potrebbe aver fatto un riavvio completo.

Questo non è un dettaglio si può facilmente retrofit, è necessario tenere utilizzo della memoria in mente fin dall'inizio e progettare il multiview applicazione in modo pulito scarrabili UIViewControllerpezzi. In realtà vale la pena di mantenere il codice compatibile con il simulatore solo per usare la sua funzione di avviso di memoria.

Quando la memoria è abbondante, niente viene scaricato e tutto è liscia come la seta, e quando la memoria è bassa le cose continuare a lavorare, anche se più lentamente. Ora direi che questa soluzione al problema memoria finita è l'ideale.

Per usufruire di questo salone di memoria di trucco, sovraccaricare i UIViewControllermetodi viewDidLoad, viewDidUnloade viewWillUnload(iOS5, utile se lo stato lo scarico richiede l'immagine per esistono ancora, per esempio, se non si vuole far trapelare le texture OpenGL e il rendering di buffer, in iOS4 è possibile simulare questo da sovraccarico didReceiveMemoryWarninge il monitoraggio visibilità del tuo vista).

ORIGINALE, risposta più bilioso

didReceiveMemoryWarning è assolutamente inutile.

Non c'è alcuna garanzia che se si liberare memoria (anche tutto) che non sarà possibile ottenere uccisi.

Nella mia esperienza amara di solito funziona così su 2.x / 3.0:

  1. mediaserverd perde un po 'di memoria

  2. la mia app viene ucciso

Purtroppo, il mietitore non pensa mai di uccidere mediaserverd.

Quindi, se l'utilizzo della memoria non è colpa tua, hai davvero avuto solo due scelte:

  1. chiedere all'utente di riavviare il sistema (utente si assume è colpa tua, scrive una recensione feroce)

  2. spero che il colpevole si blocca (mediaserverd obbliga spesso!)

Risposto il 25/06/2009 a 11:41
fonte dall'utente

voti
3

Lo scopo di didReceiveMemoryWarning è quello di dare la possibilità di liberare la memoria o pop di vista al fine di evitare un incidente. Non riceverai in qualsiasi punto prevedibile perché dipende da ciò che l'utente sta facendo. Ad esempio, se l'utente sta ascoltando l'iPod, si riduce la memoria disponibile e riceverai prima.

La regola generale è che si hanno circa 8 MB di RAM con cui lavorare. Quando si arriva vicino a quello ci si può aspettare l'evento di essere sollevato. Se sta assumendo up che tanta RAM deliberatamente si dovrebbe avere un piano per fare qualcosa al riguardo.

Risposto il 24/02/2009 a 19:34
fonte dall'utente

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