2013-12-22 3 views
0

Здравствуйте, мой вопрос, может быть, вообще я не прошу кода и т.д. я развивающейся только для iPhone'ов с iOS6.1 и вышеIOS ARC баран растет только

Когда я запускаю мое приложение ОЗУ он использует только растет (когда я переключаюсь между видами (у меня есть 15 просмотров)).

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

Несмотря на то, что мое приложение не превышает 20 мб оперативной памяти, я все еще беспокоюсь, что что-то может быть просто не в порядке.

Я использую ARC, но баран все еще поднимается.

Есть ли способ проверить, что может вызвать одностороннее распределение выводов?

+2

Ваши контактные данные: Контроллер представления не будет загружать свой вид до первого раза, когда он понадобится, но впоследствии представление будет сохранять выделенную память навсегда, если не появится предупреждение о низкой памяти. Поэтому естественно, что объем памяти увеличивается. Подумайте об этом как к кешированию - не используя память, в то время как никто другой не нуждается в ней, это будет просто неэффективное использование ресурсов. Итак, вы уверены, что память полна объектов, которые вы ожидали удалить? Инструменты расскажут вам, какие объекты используют память, или вы можете поместить NSLog в '- (void) dealloc', если хотите видеть вещи по мере их возникновения. – Tommy

+0

не беспокойтесь об этом, пока ваше приложение не упало из-за утечки памяти. –

+0

@ Томми Нет. Я не уверен (вот почему я спрашиваю). Я использую 'SWRevealViewController' как меню, и все представления внутри него, у меня есть еще несколько над ними над некоторыми внутри, но я представляю их как modalViews. Итак, после вашего комментария, я действительно успокоился :) это мое первое приложение для iOS (я новичок), поэтому я был бы уверен, что все в порядке :) –

ответ

6

Если память продолжает расти, это может быть множество разных вещей, но «сильный ссылочный цикл» является главным подозреваемым. К сожалению, это не обязательно появится в инструменте «Утечки» в «Инструменты».

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

См. Видео WWDC iOS App Performance: Memory для практической демонстрации.


Например, здесь здоровое приложение, которое я профилированного через инструмент инструментов „Утечки“, но я собираюсь сосредоточиться на „Отчисления“ инструмент:

good

В этом профиле я подождал, пока приложение успокоится, постучал по кнопке «Mark Generation» (в результате «Generation A», первый флаг на моей временной шкале). Затем я подошел к точке зрения, а затем уволил ее и снова «Mark Generation», получив «Generation B». Столбец «Рост» говорит мне, что между поколениями А и В было использовано 100 КБ, но не было выпущено. Но меня это не беспокоит, потому что может существовать некоторый внутренний кеш iOS для элементов UIKit. Итак, я повторяю этот процесс еще раз, чтобы получить «Generation C». Теперь это интересно, теперь сообщается о росте всего лишь 8.26kb, что незначительно. Это, в сочетании с чистым веществом здоровья от инструмента «Утечки», заставляет меня чувствовать себя неплохо в отношении риска серьезных проблем с памятью.

Теперь давайте контрастировать, что с какой-то код, который имеет серьезно проблематичным «сильный опорный цикл»:

strong reference cycle

Теперь это совершенно иная картина, несмотря на то, что процесс был тот же «присутствует и отклонить ", повторяется дважды. Сейчас я говорю, что у меня был рост в 14 млн. Между поколениями, и, что более важно, я вижу отчетливо кривую роста. Замечательно то, что в то время как инструмент Allocations явно ломает серьезную проблему, инструмент «Утечки» ничего не сообщает.

Теперь на практике реальный опыт работы с инструментом Allocations, вероятно, будет находиться где-то между этими двумя крайностями. У вашего приложения могут быть свои собственные кэши или объекты модели, которые медленно занимают память, но если вы правильно отвечаете на предупреждения о памяти, вы должны восстановить эту память. Откровенно говоря, большинство хорошо разработанных приложений вообще не должны генерировать предупреждения о памяти (обычно это достигается путем правильной настройки кешей, избегая при необходимости imageNamed, переходя в постоянное хранилище для больших или редко доступных данных и т. Д.). Цель состоит в том, чтобы добраться до точки, где приложение стабилизируется вокруг некоторого разумного уровня выделения базовой памяти, последовательно возвращаясь к этой базовой линии.

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

+0

Спасибо Рон великий и воспитательный. Нет, я никогда не получал никаких предупреждений о памяти в своем приложении, даже я оставил его для ночной работы и т. Д., . Мой источник сомнений был связан с отслеживанием памяти XCode, всегда появляется вверх, когда я открываю новый вид, однако анализ внутри XCode и утечки внутри инструменты ничего не нашли, я как можно скорее попробую ассигнования, Спасибо за ваш ответ/руководство. –

+0

Рома-ты отключил Зомби? Если они включены, память не будет выпущена –

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