2011-09-30 3 views
7

Я создаю приложение, которое имеет несколько анимаций. Есть 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") 

Я искал много, но не смогли найти каких-либо надлежащих решений этого вопроса.

+1

Вы пытались запустить «Анализатор», чтобы узнать, не обнаружены ли какие-либо потенциальные утечки? – 5StringRyan

+0

@ HansGruber: Да, мы попробовали работать с утечками памяти, но мы не обнаружили утечек. Любое другое решение на том же, пожалуйста .. Спасибо. –

+0

Анализатор и утечки - это разные инструменты. Существует статический анализатор clang, который вы можете использовать для поиска не только утечек памяти, но и других проблемных точек в коде. Рекомендуется периодически запускать его. Обратите внимание, что статический анализатор clang не работает под инструментами и не является профилирующим инструментом. Вы найдете его в меню «Продукты». «Продукты> Анализ». С другой стороны, утечки - это инструмент профилирования для мониторинга объектов, чтобы убедиться, что они не освобождены после удаления всех ссылок на объект. – Sam

ответ

0

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

+0

Спасибо за ваш ответ, но мы использовали IBOutlet в XIB и меняем изображения на нем соответственно .... Пожалуйста, предложите нам что-то на нем больше .. Спасибо .. –

+0

Можете ли вы добавить код, так что легко обнаружить ошибку , –

0

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

0

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

0

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

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

+0

Этот ответ верен, если вы получаете сигнал 0, тогда вы использовали всю доступную память приложения. Вам нужно вернуться и переписать код, чтобы он не сохранял все распакованные изображения в памяти одновременно. Это ваша самая вероятная причина нехватки памяти, потому что декомпрессированные изображения являются ОГРОМНЫМИ! – MoDJ

0

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

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

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

viewDidUnload:

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

loadView:

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

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

viewDidLoad:

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

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

+0

viewDidUnload устарел в iOS 6.0. Представления больше не очищаются в условиях низкой памяти, поэтому этот метод никогда не вызывается. – Bastian

0

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

0

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

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

0

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

Смежные вопросы