2012-01-27 14 views
6

Mam dziwną sytuację. Mam dość intensywny proces pamięci (przetwarzanie obrazu), ale udało mi się rozwiązać wszystkie problemy i działa w 99% przypadków.Aplikacja iOS ulega awarii po ostrzeżeniu o pamięci po powrocie z tła, ale nie wcześniej?

Jeśli jednak ustawię aplikację w stanie nieaktywnym lub w tle, po powrocie i próbie uruchomienia tego samego procesu otrzymam ostrzeżenia z pamięci, a następnie aplikacja ulegnie awarii.

Użyłem przyrządów do analizy śladu pamięci w dwóch przypadkach użycia, a ślad pamięci jest dokładnie taki sam. Jednak w przypadku, gdy nie umieszczam aplikacji w tle (lub nieaktywny), nie daje mi to żadnych błędów pamięci i kończy się dobrze. W przypadku użycia, w którym został umieszczony w tle (lub nieaktywny) otrzymuję błędy pamięci i ulega awarii.

Czy ktoś ma jakiekolwiek informacje na ten temat? Przeszukałem net/irc/stack over/apple docs, próbując to zrozumieć. Czy Apple (iOS) zmniejsza ilość pamięci, którą moja aplikacja może uruchamiać po powrocie z tła? Czy istnieje sposób, aby temu zapobiec? Czy mogę przeoczyć inne, bardziej proste rozwiązanie?

(Uwaga, nie ma wycieków pamięci)

+0

Proszę dodać komunikat o błędzie do Q. – mit3z

+0

Nie ma komunikatu o błędzie, ponieważ jest to błąd niskiej pamięci, który powoduje awarię. –

+0

Czy robisz coś w metodach delegowania aplikacji podczas wchodzenia lub wychodzenia z pierwszego planu/rezygnacji/stawania się aktywnym? – jrturton

Odpowiedz

2

W porządku, wymyśliłem to - iOS nie robi nic głupiego, to był oczywiście programista :) Był jeszcze jeden komponent (ViewController) do mojego projektu, który zrobił pewne rzeczy po powrocie z tła, takie jak przydzielanie pamięci. Jednak ten widok nie był aktywny, więc przydzielenie potrzebnej pamięci okazało się bezużyteczne. Po oczyszczeniu kodu nie natrafiłem na żadne błędy pamięci.

0

Być może aplikacja odbiera ostrzeżenia pamięci podczas gdy w tle, a Twoje odpowiedzi do tego są różne, na przykład: w tle wszystkie kontrolery widoku mogą mieć swoje zawartość jest rozładowywana po odebraniu ostrzeżenia o pamięci, ale na pierwszym planie aktywny kontroler widoku nie zostanie rozładowany. Możesz wysyłać wiadomości do zwolnionych instancji, jeśli na przykład kontroler widoku lub jeden z jego obiektów zostanie ustawiony jako delegat innego procesu w Twojej aplikacji, który nie reaguje na ostrzeżenia o małej ilości pamięci.

Bez znajomości szczegółów awarii, które naprawdę należy uwzględnić, a także więcej informacji na temat struktury aplikacji, to moje najlepsze przypuszczenie.

+0

Nie otrzymuję żadnych błędów pamięci w tle, a widoki są ładowane po wznowieniu aplikacji. Ale kiedy klikam "go" na mojej aplikacji, aby rozpocząć przetwarzanie obrazu, ulega awarii z powodu małej ilości pamięci, ale dopiero po powrocie z tła. –

+0

(Pracuję też z Spongey) No tak, problem nie polega na tym, że aplikacja się zawiesza, gdy jest w tle, wraca na pierwszy plan świetnie, problem polega na tym, że kiedy używamy aplikacja ulega awarii z powodu niskiej ilości pamięci. Jeśli wykonamy dokładnie to samo zachowanie, ale w/out szybko się przełącza, to działa dobrze, a nie jedno ostrzeżenie. – Shizam

+0

W jaki sposób aplikacja reaguje na ostrzeżenia o małej ilości pamięci? Czego się pozbędziesz? – jrturton

2

Tylko do sprawdzenia, podczas uruchamiania dowolnego procesu w tle, powinien znajdować się w puli autorelease. Procesy w tle działają równolegle z głównym wątkiem. Tak więc podczas wykonywania dowolnego zadania w tle powinniśmy popatrzeć na pamięć. Jest to często spotykany błąd związany z wyciekiem. Również operacje dotyczące UIKit zawsze działają w głównym wątku. Więc jeśli przetwarzasz jakiekolwiek dane z tła & chcesz pokazać je w interfejsie użytkownika, to zostanie on załadowany na główny wątek.

Powiązane problemy