приложение отлично работает на iPad 2, вылетает на iPad 3, с предупреждением о нехватке памяти

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

   process name, UUID, rpages, recent_max, [reason] (state)

и под заголовками этих столбцов только шестнадцатеричный код, ничего не показывающее вызовы методов или строки в проекте.

Любые идеи? мне не хватает некоторых флагов в коде, которые позволяют лучше журнал сбоев?

Спасибо.


person Huang    schedule 04.03.2013    source источник
comment
Идентичны ли версии iOS на двух устройствах? Вылетает ли iPad 3 все время в одном и том же месте или каждый раз в другом? Это для всех iPad 3 или только для некоторых (или для одного)? Освобождаете ли вы значительный объем памяти в своих didReceiveMemoryWarning процедурах?   -  person Rob    schedule 06.03.2013


Ответы (2)


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

Как сказал Дэниел, вы можете посмотреть ссылку Техническая записка 2151, но, как говорится:

Когда вы видите сбой из-за нехватки памяти, вместо того, чтобы беспокоиться о том, какая часть вашего кода выполнялась во время завершения, вам следует изучить свои шаблоны использования памяти и свои ответы на предупреждения о нехватке памяти. Справка по распределению памяти содержит подробные инструкции по использованию Leaks Instrument для обнаружения утечек памяти и по использованию функции Mark Heap инструмента Allocations, чтобы избежать потери памяти. Память В «Руководстве по эффективности использования» обсуждаются правильные способы реагирования на уведомления о нехватке памяти, а также множество советов по эффективному использованию памяти. Также рекомендуется проверить сеанс WWDC 2010, Расширенный анализ памяти с Инструменты.

Итак, пара мыслей:

  1. Вы искали утечки? Поиск утечек рассказывается, как использовать инструменты для поиска утечек.

  2. Если вы включили зомби, вы их выключили? Зомби - отличный диагностический инструмент, но он просто потребляет память.

  3. Вы запускали свой код через статический анализатор (shift + command + B или выбирали «Анализировать» в меню «Продукт»)? Особенно при использовании кода, отличного от ARC, это может вызвать множество проблем с памятью.

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

    Например, при запуске инструмента «Распределение» удерживайте нажатой клавишу выбора, а затем щелкните и перетащите мышью, чтобы выделить часть временной шкалы, чтобы определить, что вы хотите проверить. Вероятно, вы захотите сосредоточиться на одном из всплесков распределения. Например, я обнаружил бугорок в своих выделениях и выделил его как таковой (это был смехотворно простой пример, в котором я создаю огромный массив в viewDidLoad, но, надеюсь, это даст вам идею):

    выделения

    Обратите внимание: я считаю полезным показать дерево вызовов на нижней панели, часто бывает полезно выбрать «Скрыть системные библиотеки», чтобы сосредоточиться на вашем коде (и «Инвертировать дерево вызовов» тоже). И если вы дважды щелкните имя метода в Instruments (в моем примере это будет viewDidLoad), Instruments покажет вам ваш код, выполняющий распределение:

    показать код

person Rob    schedule 04.03.2013
comment
Спасибо, это действительно полезно, но почему это могло произойти только в iPad 3? у него меньше памяти, чем у iPad 2? - person Huang; 06.03.2013
comment
@Huang Нет, там больше. Так что, если вы получаете предупреждения о памяти, это означает, что у вас происходит вопиющее потребление памяти. Вы можете посмотреть на различия в конфигурациях (версии iOS, сетчатка против сетчатки, настройки Wi-Fi и сотовой связи и т. Д.), Но для предупреждений о нехватке памяти я бы сосредоточился на утечках и выделениях. Тратить много времени на изучение журнала аварийных событий немного похоже на то, как смотреть на обломки автомобиля в овраге, где анализ природы искривленного металла, образовавшегося в результате удара, часто не связан с тем, что заставило автомобиль уехать. обрыв в первую очередь. - person Rob; 06.03.2013

Предупреждения о нехватке памяти создают журнал, отличный от стандартных сбоев. Взгляните на раздел «Общие сведения об отчетах о нехватке памяти» этой статьи, чтобы понять, что произошло с вашим приложением и как вы можете отладить его с помощью инструментов: http://developer.apple.com/library/ios/#technotes/tn2151/_index.html

person Daniel Martín    schedule 04.03.2013