Может ли приложение для iPad вызвать перезагрузку устройства? - PullRequest
4 голосов
/ 26 июля 2011

У меня есть приложение для iPad, в котором есть процесс загрузки большого количества файлов карт (пара гигабайт данных и 10 тысяч файлов).

В моем последнем тестовом выпуске устройство иногдаперезагрузка во время процесса загрузки (загрузка может занять несколько часов).

При перезагрузке приложения оно не оставляет отчет о сбое.Мы наблюдали такое поведение на iPad 1 и iPad 2 под управлением 4.3.3.

Единственное, о чем я могу думать, - мы увеличили максимальное число одновременных потоков с 4 до 20 для выполнения этих загрузок.

Ответы [ 3 ]

6 голосов
/ 26 июля 2011

Полное исчерпание системной памяти вызывает полную перезагрузку устройства.Раньше это было более распространено в iPhone OS 2.0, работающей на ограниченном оборудовании первоначальных iPhone и iPod touch.В последних версиях ОС Apple более жестко предписывала принудительное уничтожение вашего приложения, когда оно превышало потолок памяти, поэтому сделать это стало намного сложнее.Кроме того, устройства имеют гораздо больше памяти, чем раньше.

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

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

Кроме того, вместо того, чтобы иметь кучу потоков, которые потребляют ресурсы, вы рассматривали использование GCD или основанной на очереди инфраструктуры, такой как ASIHTTPRequest?Они могут быть более эффективными для вашего приложения, но при этом обеспечить необходимый вам параллелизм.

0 голосов
/ 26 июля 2011

Вы отлаживали в инструментах? Это покажет вам, увеличиваются ли выделения и заполняет ли память. Если вы пытаетесь загрузить эти ГБ в память, то, конечно, у вас возникнет сбой.

Кроме того, вы смотрели на dispatch_apply вместо потоков? GCD автоматически распределяет и увеличивает / уменьшает потоки, которые он использует в зависимости от нагрузки. Таким образом, вам не нужно управлять этим самостоятельно. Возможно, стоит попробовать.

0 голосов
/ 26 июля 2011

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

Попробуйте опубликовать код.

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