Jestem na część mojego procesu rozwoju dla tropienia upaść i pamięci przecieki. Jako strategię, można umieścić żadnych wiadomości NSLog lub powiadomienia o coś takiego się didReceiveMemoryWarning:? Dokumentacja dla tej metody jest raczej rzadki. Jest to dokładne, aby powiedzieć, że przed awaria będzie stało, UIViewController wywoła tę metodę? Jest to punkt wyjścia, zanim nawet posuwają się do przodu z instrumentami?
iOS: Przydatność didReceiveMemoryWarning:
OK, kilka rzeczy do uwaga:
- didReceiveMemoryWarning zostanie wezwany przed out-of-memory katastrofie. Nie inne awarie. Jeśli uchwyt ostrzeżenie prawidłowo i zwolnić pamięć, wtedy można uniknąć stanu out-of-memory i nie upaść.
- Można ręcznie wywołać ostrzeżenie pamięci w symulatorze w menu Hardware. Gorąco polecamy ten sposób przetestować obsługę didReceiveMemoryWarning.
- Instrumenty pomaga debugowania wycieków (choć nie wszystkie z nich) - to naprawdę nie jest to przydatne do awarii.
- Nie, nie mam osobiście używać NSLog - Właśnie breakpoint ostrzeżenia pamięci, gdy jestem debugowania.
Jeśli użytkownik otworzy lewo niektóre aplikacje trzeba będzie bardzo mało pamięci do Państwa dyspozycji. Więc czasami didReceiveMemoryWarningmoże być wywołana przez system dopiero po 1 MB użytkowania.
System nazywa tę metodę na wszystkich kontrolerów widoku, jeśli umieścić NSLog w każdym z kontrolerów widoku, można zauważyć, że.
Następnie automatycznie metoda viewDidUnloadzostanie wywołana przez system na wszystkich kontrolerach widzenia (nie dealloc). Więc trzeba umieścić wszystkie swoje instrukcje dealokacji tam.
Trzeba zrobić wiele eksperymentów, ponieważ jeśli aplikacja jest kompleks będzie musiał stawić czoła wielu wypadkach przed zarządzania to dobrze.
UPDATE
W iOS 6, UIViewControllerpoglądy nie są rozładowywane w odpowiedzi na ostrzeżenia pamięci. Zamiast po prostu jak najlepiej, aby zwolnić wszelkie zasoby można rozsądnie ponownego utworzenia (np buforowane dane), gdy didReceiveMemoryWarningjest tzw.
UPDATE
pisałem mój oryginalny odpowiedź, kiedy byłem wściekły młody człowiek; Czasy się zmieniły, a przede wszystkim, że to jest złe.
Jeśli masz aplikację, za pomocą jednego kontrolera widoku i pojawia się ostrzeżenie pamięci, nie ma wiele można zrobić. Ale sytuacja zmienia się dramatycznie, jeśli masz wiele kontrolerów widzenia, ponieważ można wyładować wszystkie stanu związanego z nie zrównuje kontrolerów. W rzeczywistości [UIViewController didReceiveMemoryWarning]będzie prod Cię we właściwym kierunku przez wyładowania swoich niewidocznych widoków podczas (niespodzianka!). Gdy zrównuje kontroler widoku zostaje odrzucona, podstawowe pogląd jest przeładowane i co najwyżej użytkownik powinien być tylko świadomy opóźnieniem, chociaż wewnętrznie aplikacja może zrobić kompletny restart.
To nie jest jakiś szczegół można łatwo zmodernizować, trzeba mieć na uwadze, zużycie pamięci od początku i zaprojektować aplikację MultiView na czysto może załadować UIViewControllerkawałki. W rzeczywistości jest to warte zachowania kod kompatybilny z symulatorem po prostu wykorzystać swoją funkcję ostrzegawczą pamięci.
Kiedy pamięć jest obfita, nic nie jest obciążony, a wszystko jest jedwabiście gładka, a gdy zaczyna brakować pamięci rzeczy nadal pracować, choć wolniej. Teraz powiedziałbym, że to rozwiązanie problemu pamięci skończonej jest idealny.
Aby skorzystać z tego salonu pamięć sztuczki, przeciążać UIViewControllermetody
viewDidLoad, viewDidUnloadoraz
viewWillUnload(iOS5, przydatne jeśli rozładunku stan wymaga widoku nadal istnieje, na przykład, jeśli nie chcesz, aby Twoje tekstur OpenGL przeciekać i renderowanie bufor, na iOS4 można symulować to przez przeciążenie didReceiveMemoryWarningi śledzenie widoczności widoku danych,).
ORYGINALNY, WIĘCEJ bilious ODPOWIEDŹ
didReceiveMemoryWarning jest całkowicie bezużyteczny.
Nie ma gwarancji, że jeśli zwolnić pamięć (nawet wszystkie z nich), że nie będzie zabity.
W moim gorzkiego doświadczenia, że zwykle działa tak na 2.x / 3.0:
mediaserverd przecieki pęczek pamięci
moja aplikacja zostanie zabity
Niestety, nigdy żniwiarz myśli o zabiciu mediaserverd.
Więc jeśli zużycie pamięci nie jest twoja wina, ty naprawdę dostał tylko dwie możliwości:
poprosić użytkownika o ponowne uruchomienie (użytkownik zakłada, że to twoja wina, pisze zjadliwe przeglądu)
nadzieję, że sprawcą awarii (mediaserverd często zmusza!)
Celem didReceiveMemoryWarning jest dać szansę wolnej pamięci lub pop widoki, aby uniknąć zderzenia. Nie otrzyma go w dowolnym punkcie przewidywalny, ponieważ zależy od tego, co użytkownik robi. Na przykład, jeśli użytkownik jest słuchanie iPoda, jest mniej dostępnej pamięci, a otrzymasz go wcześniej.
Ogólną zasadą jest, że masz około 8 MB pamięci RAM do pracy. Zbliżając się do tego można oczekiwać zdarzenie zostać podniesiony. Jeśli pacjent przyjmuje się, że dużo pamięci RAM celowo trzeba mieć plan, aby coś z tym zrobić.













