Как разрешить падение памяти - PullRequest
7 голосов
/ 30 сентября 2011

Я создаю приложение, в котором есть несколько анимаций. Есть 50 страниц, и на каждой странице есть различная анимация, и каждая анимация использует много изображений.

Я использую UIPresentModelViewController для представления представлений и меняю изображения используя NSTimer.

При непрерывном перелистывании приложение вылетает с таким сообщением: -

Program received signal:  “0”.
Data Formatters temporarily unavailable, will re-try after a 'continue'. 

(Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")

Я много искал, но не смог найти правильного решения этой проблемы.

Ответы [ 8 ]

0 голосов
/ 19 мая 2015

Выясните причину сбоя памяти с помощью инструментального инструмента, а затем выполните рефакторинг кода с лучшими практиками с рекомендуемым шаблоном проектирования. Не существует уникального решения для этого. Спасибо.

0 голосов
/ 09 октября 2011

Существует один простой способ обнаружения утечек, который трудно обнаружить с помощью инструментов утечки и т. Д. - анализатор зомби.Он показывает каждую несвязанную память в вашей программе, и вы можете легко обнаружить утечки и оптимизировать код за считанные минуты.

0 голосов
/ 31 мая 2013

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

Посмотрите на cocos2d или другие фреймворки, которые популярны для создания игр, поскольку они будут гораздо более эффективными для анимации, чем просто UIKit.

0 голосов
/ 06 октября 2011

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

Рассмотрите следующий возможный сценарий и посмотрите, соответствует ли он тому, как вы кодировали эту программу.

Чтобы ОС могла управлять памятью, она может выгружать представления и перезагружать их по мере необходимости. Когда это сделано, вызываются методы viewDidUnload, loadView и viewDidLoad.

viewDidUnload:

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

loadView:

Контроллер представления вызывает этот метод, когда запрашивается свойство представления, но в данный момент оно равно nil. Если вы создаете свои представления вручную, вы должны переопределить этот метод и использовать его для создания ваших представлений. Если вы используете Interface Builder для создания ваших представлений и инициализации контроллера представления, то есть вы инициализируете представление с помощью initWithNibName: bundle: метод, устанавливаете свойства nibName и nibBundle напрямую или создаете оба представления и контроллер представления в Interface Builder. тогда вы не должны переопределять этот метод.

Проверьте ссылку на класс UIView -

viewDidLoad:

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

Возможно, вы непреднамеренно инициализировали эти представления в ваших методах init, а не в ваших методах loadView. Если вы это сделали, то когда ОС выгрузит представление (вы увидите, что вызывается viewDidUnload), память, связанная с представлением, и все подпредставления (все изображения и анимации) будут выгружены. Это экономит память, но когда вам нужно, чтобы одно из этих незагруженных представлений появилось снова, сначала будет вызван loadView, если представление было ранее выгружено. Если настройка вашего представления выполняется в методах init, а не в loadView, то представление снова не будет настроено. Но если настройка представления выполняется в методе loadView, его можно восстановить после того, как управление памятью выгружает его.

0 голосов
/ 05 октября 2011

Сигнал 0 обычно возникает из-за нехватки памяти, так как приложение использует слишком много памяти.Проверьте, вызывается ли метод предупреждения памяти или нет.

Не удалось загрузить устройство форматирования данных, возможно, из-за нехватки памяти для его загрузки ..

0 голосов
/ 05 октября 2011

Это звучит как переполнение стека для меня.В разделе «Другие флаги C» в настройках языка проекта C / C ++ добавьте флаг «-fstack-check» и посмотрите, приводит ли это к какой-либо нежелательной рекурсии.

0 голосов
/ 05 октября 2011

Вам нужно посмотреть (и, возможно, опубликовать) трассировку стека при сбое. И код, который меняет изображение. Это звучит как раздувание памяти (не настоящая утечка в том, что кто-то все еще ссылается на память). Пункт меню «Анализ» может что-то перехватить (и вы обязательно должны его запустить), но вам может понадобиться запустить инструмент выделения и посмотреть проверки кучи. Подробнее см. http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/.

0 голосов
/ 30 сентября 2011

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

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