2015-03-11 2 views
1

У меня есть приложение, которое я разрабатываю, и у него определенно есть проблемы с памятью после длительного использования на iPad mini 1. Отладчик начнет выплевывать предупреждения о памяти до тех пор, пока он не сработает, и я хотел бы знать, какой контроллер в нашем коде вызывает Эта проблема.как отлаживать предупреждения памяти в Swift?

Вот пример отладочного сообщения.

2015-03-11 17:04:02.420 PROJECT_NAME[154:4100] Received memory warning. 

Сообщение отладки, которое я получаю, дает временную метку и название проекта с некоторой информацией в скобках. Как я могу использовать это, чтобы найти, какой контроллер вызывает эту проблему? Информация о скобках, по-видимому, не является номерами кодовых строк, поскольку имя не является именем проекта, а не именем файла.

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

Что лучше всего отследить и отладить в Swift?

Дайте мне знать, если мне нужно предоставить дополнительную информацию.

UPDATE

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

UPDATE

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

enter image description here

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

+0

Вы можете использовать инструмент инструментов –

+0

Профилировщик Allocations может помочь. Таким образом, может быть профилировщик времени, если проблемы с памятью заставляют ваше приложение реагировать медленно. –

+1

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

ответ

5

На этом этапе вам необходимо изменить шестерни, если вы хотите определить источник проблем с памятью. Используйте инструменты, как показано на видео WWDC 2013 Fixing Memory Issues или WWDC 2012 iOS App Performance: Memory. Используя инструмент «Выделение» в Инструментах, вы можете определить, что выделяется и не выпускается. Только после этого вы можете приступить к решению проблемы (например, исправление любых сильных ссылочных циклов и т. Д.). Мы не можем советовать вам, как устранить проблему, пока вы не определите источник проблемы, и инструменты помогут вам в этом.

Хотя эти презентации иллюстрируют практику с Objective-C, принципы в Swift одинаковы, а использование инструментов Allocations and Leaks в Инструментах одинаково.

+0

Я проверю их и обновить сообщение или принять в зависимости от того, как это происходит. +1 Вопрос: что означает [NUMBER: NUMBER] в распечатке из отладчика? – Unome

+1

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

+0

Я посмотрю на них завтра на работе. В чем смысл функции предупреждения didReceiveMemory? Я предполагаю, что когда он обнаруживает проблему, он вызывает содержимое указанного метода, и вы можете выполнить некоторую рутинную очистку для уменьшения использования памяти, но если это происходит только в прошлых проблемах, это означает, что она вызывает каждую функцию * doneRecieveMemory * от каждого контроллера, поскольку технически он слеп к тому, что вызывает проблему? – Unome

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