Приложение iOS вылетает из памяти после возврата из фона, но не раньше? - PullRequest
7 голосов
/ 27 января 2012

У меня странная ситуация. У меня запущен довольно интенсивный процесс (обработка изображений), но я обработал все изгибы, и он работает нормально в 99% случаев.

Однако, если я переведу приложение в неактивное или фоновое состояние, при возврате и попытке запустить тот же процесс я получаю предупреждения о памяти, а затем приложение вылетает.

Я использовал инструменты для анализа объема памяти в двух случаях, и объем памяти точно такой же. Тем не менее, в случае, когда я не помещаю приложение в фоновый режим (или неактивно), оно не выдает мне ошибок памяти и завершает нормально. В случае использования, когда он был помещен в фоновый режим (или неактивен), я получаю ошибки памяти, и он вылетает.

У кого-нибудь есть информация по этому поводу? Я изучал net / irc / stack over / apple docs, пытаясь выяснить это. Сокращает ли Apple (iOS) объем памяти, с которой моему приложению разрешено работать после возвращения из фона? Есть ли способ предотвратить это? Или я пропускаю другое, более простое решение?

(обратите внимание, утечек памяти нет)

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Хорошо, разобрался - iOS не делает ничего глупого, это, конечно, разработчик :) Был еще один компонент (ViewController) для моего проекта, который делал некоторые вещи при возврате из фона, такие как выделение памяти. Однако это представление не было активным, поэтому выделение необходимой памяти оказалось бесполезным. После очистки кода я не столкнулся с ошибками памяти.

2 голосов
/ 21 сентября 2012

Просто для проверки, при запуске любого фонового процесса он должен быть в пуле авто-релиза.Фоновые процессы работают параллельно с основным потоком.Поэтому при выполнении любой задачи в фоновом режиме мы должны смотреть на память.Это распространенная ошибка, часто встречающаяся для утечки.Также операции, связанные с UIKit, всегда выполняются в основном потоке.Так что если вы обрабатываете какие-либо данные в фоновом режиме и хотите показать их в пользовательском интерфейсе, они будут загружены в основной поток.

0 голосов
/ 27 января 2012

Возможно, ваше приложение получает предупреждения памяти в фоновом режиме, и ваши ответы на это различны: например, в фоновом режиме все контроллеры представления могут выгружать свое содержимое при получении предупреждения о памяти, но на переднем плане ваш Контроллер активного вида не будет выгружен. Вы можете в конечном итоге отправлять сообщения в освобожденные экземпляры, если, скажем, контроллер представления или один из его объектов настроен как делегат какого-то другого процесса в вашем приложении, который не отвечает на предупреждения о нехватке памяти.

Поскольку вы знаете подробности сбоев, которые вам действительно следует включить, и больше о структуре приложения, это мое лучшее предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...