Sunt la o parte din procesul meu de dezvoltare pentru urmărirea în jos de blocare și de memorie scurgeri de informații. Ca o strategie, nu ai pus nici un mesaj NSLog sau notificări ale unor astfel de în didReceiveMemoryWarning:? Documentația pentru această metodă este destul de rară. Este corect să spunem că , înainte de un accident se va întâmplă, UIViewController va declanșa această metodă? Este ca un punct de plecare chiar înainte de a merge mai departe cu instrumente?
iOS: ajutorării de didReceiveMemoryWarning:
sursa de către utilizator Coocoo4Cocoa
În alte limbi...
OK, mai multe lucruri de reținut:
- didReceiveMemoryWarning va fi numit înainte de un accident de out-of-memorie. Nu sunt alte accidente. Dacă manevrați avertizarea în mod corespunzător și pentru a elibera memorie, atunci puteți evita starea out-of-memorie și nu crash.
- Puteți declanșa manual un avertisment de memorie în simulator în meniul Hardware. Foarte recomandăm să faceți acest lucru pentru a testa manipularea dvs. de didReceiveMemoryWarning.
- Instrumentele vă ajută să depana scurgeri de informații (deși nu toate) - nu e chiar atât de util pentru accidente.
- Nu, eu nu folosesc personal NSLog - Tocmai am punct de întrerupere avertizările de memorie atunci când am depanare.
În cazul în care utilizatorul a lăsat unele aplicații deschise pe care va avea foarte puțină memorie la dispoziția dumneavoastră. Deci , uneori , didReceiveMemoryWarningpoate fi numit de către sistem numai după 1 MB de utilizare.
Sistemul face apel la această metodă pe toate controlerele afișăril, dacă plasați un NSLog în fiecare dintre controlere afișăril, veți observa că.
Apoi , în mod automat metoda viewDidUnloadva fi numit de către sistem pe toate controlerele afișăril (nu dealloc). Deci , trebuie să puneți toate instrucțiunile dumneavoastră deallocation acolo.
Trebuie să facă o mulțime de experimente, deoarece în cazul în care aplicația este complex, se va confrunta cu multe accidente înainte de a gestiona bine.
UPDATE
Ca iOS 6, UIViewControllerpunctele de vedere nu mai sunt descărcate ca răspuns la avertismente de memorie. În schimb doar face cel mai bun pentru a elibera orice resurse pe care le poate în mod rezonabil creați din nou ( de exemplu , datele stocate în memoria cache) , atunci când didReceiveMemoryWarningeste chemat.
UPDATE
am scris răspunsul meu original , când eram un tânăr furios; ori s- au schimbat și practic, este greșit.
Dacă aveți o aplicație cu un singur controler de vizualizare și veți primi un avertisment de memorie, nu prea poți să faci. Dar lucrurile se schimba dramatic dacă aveți mai multe controlere de vizualizare, pentru că puteți descărca toate de stat asociate cu controlerele non - prim - plan. De fapt , [UIViewController didReceiveMemoryWarning]va prod în direcția corectă de descărcare vizualizările care nu sunt vizibile pentru tine (surpriza!). În cazul în care regulatorul de vedere este prim - plan a respins, ecranul de bază este reîncărcate și cel mai utilizatorul ar trebui să fie doar conștienți de întârziere , chiar dacă pe plan intern aplicația poate fi făcut o repornire completă.
Acest lucru nu este un detaliu pe care îl puteți cu ușurință retrofit, aveți nevoie pentru a păstra utilizarea memoriei în minte de la început și proiectarea aplicației Multiview în curat unloadable UIViewControllerbucăți. De fapt , este în valoare de păstrarea codul compatibil cu simulatorul doar pentru a utiliza funcția de avertizare de memorie.
Când memoria este abundent, nimic nu este descărcat și totul este cursivă, iar atunci când memoria este redusă, lucrurile continue să lucreze, deși mai lent. Acum, aș spune că această soluție la problema de memorie finită este ideală.
Pentru a profita de acest salon de memorie truc, supraincarcati UIViewControllermetodele
viewDidLoad, viewDidUnloadși
viewWillUnload(iOS5, util în cazul în care starea de descărcare impune punctul dumneavoastră de vedere să existe în continuare, de exemplu , dacă nu doriți să scurgeri texturi OpenGL & randare tampon, pe iOS4 puteți simula acest lucru prin supraîncărcare didReceiveMemoryWarningși urmărire vizibilitatea vizualizare dvs.).
ORIGINAL, răspuns mai irascibil
didReceiveMemoryWarning este absolut inutil.
Nu există nici o garanție că, dacă eliberați memorie (chiar toate din el) că nu va fi ucis.
În experiența mea amară, de obicei, funcționează ca acest lucru pe 2.x / 3.0:
mediaserverd scurgeri o grămadă de memorie
aplicația mea e ucis
Din păcate, Secerătorul nu se gândește la uciderea mediaserverd.
Deci, dacă utilizarea memoriei nu este vina ta, ai într-adevăr are doar două opțiuni:
cere utilizatorului să repornească (utilizator presupune că e vina ta, scrie o recenzie usturătoare)
speranța vinovatul se blochează (mediaserverd obligă de multe ori!)
Scopul didReceiveMemoryWarning este de a vă oferi o șansă de a elibera memorie sau pop vederi pentru a evita un accident. Tu nu-l va primi în orice punct previzibil, deoarece aceasta depinde de ceea ce face utilizatorul. De exemplu, în cazul în care utilizatorul este de a asculta la iPod, există mai puțină memorie disponibilă și o veți primi mai devreme.
Regula generală de degetul mare este că aveți aproximativ 8 MB de RAM pentru a lucra cu. Când te apropii de care vă puteți aștepta ca evenimentul să fie ridicat. Dacă luați până multă memorie RAM în mod deliberat ar trebui să aibă un plan de a face ceva despre el.