Nie mogę ustalić, dlaczego iOS kończy moją aplikację (iPad, iOS 4) z powodu użycia pamięci, nawet po zwolnieniu tony pamięci w odpowiedzi na ostrzeżenia o małej ilości pamięci. Na przykład, oto typowy scenariusz wypowiedzenie ze mną zalogowaniu zużycie pamięci co tak często - spojrzeć na „APP” użytkowania, pierwsza wartość KB na każdej linii:Dlaczego iOS przerywa moją aplikację, nawet jeśli zwolniam dużo pamięci w odpowiedzi na ostrzeżenia o pamięci?
...
2011-12-14 13:25:42.343 Oyster[211:707] Memory usage (KB): app 268256, delta 6472, used 366800/373940
2011-12-14 13:25:43.292 Oyster[211:707] Memory usage (KB): app 273900, delta 5644, used 372444/381024
2011-12-14 13:25:44.159 Oyster[211:707] Memory usage (KB): app 282920, delta 9020, used 381464/389116
2011-12-14 13:25:45.184 Oyster[211:707] Memory usage (KB): app 272140, delta -10780, used 370684/379432
2011-12-14 13:25:46.109 Oyster[211:707] Memory usage (KB): app 260412, delta -11728, used 358956/365900
2011-12-14 13:25:48.443 Oyster[211:707] Received memory warning. Level=2
2011-12-14 13:25:48.454 Oyster[211:707] Memory usage (KB): app 9172, delta -251240, used 107716/112548
(gdb)
widać Wykorzystanie aplikacji pamięci wzrasta do dostaje ostrzeżenie o pamięci. Następnie poprawnie reaguję na ostrzeżenie o pamięci i uwalniam pamięć (250 MB!). W tym momencie moja aplikacja zostaje zakończona, a iOS przechodzi do ekranu głównego iPada.
Tutaj wyświetlane są dzienniki "Wykorzystanie pamięci" oznaczone numerem logMemoryUsage() function bazującym na kodzie z this answer.
Do zapisywania używam SDWebImage do buforowania UIImages w pamięci, ale jak pokazano, obsługuje ostrzeżenia pamięci przez opróżnianie jego pamięci podręcznej (raczej duże w tym momencie). Zdaję sobie sprawę, że mogę zmodyfikować pamięć podręczną SDWebImage, aby nie wypełniać całej dostępnej pamięci i tylko czekać na ostrzeżenia o pamięci, ale to rodzi następujące pytanie ...
Dlaczego iOS kończy moją aplikację, mimo że odpowiadam na ostrzeżenia dotyczące pamięci szczęśliwie uwalniając mnóstwo pamięci?
Dołącz dziennik zakończenia. W innym miejscu może wystąpić niepowiązany błąd. – PengOne
Co to jest "dziennik zakończenia" i jak go wyświetlić? –
Włącz debuger. Gdy aplikacja się zawiesza, konsola powinna mieć komunikat o następującej treści: "Aplikacja kończy się z powodu ..." – PengOne