Если память продолжает расти, это может быть множество разных вещей, но «сильный ссылочный цикл» является главным подозреваемым. К сожалению, это не обязательно появится в инструменте «Утечки» в «Инструменты».
Сделайте снимки/поколения в инструменте Allocations и определите, что не освобождается (особенно если оно состоит из любого из ваших классов) и оттуда. В частности, запустите приложение через его шаги, затем отметьте моментальный снимок/генерацию, сделайте немного больше, а затем отметьте другой снимок/генерацию. Посмотрите на этот второй снимок и посмотрите, что было выделено (но не выпущено), захваченное с момента предыдущего снимка, с акцентом на ваши классы. Вы найдете виновника довольно быстро таким образом.
См. Видео WWDC iOS App Performance: Memory для практической демонстрации.
Например, здесь здоровое приложение, которое я профилированного через инструмент инструментов „Утечки“, но я собираюсь сосредоточиться на „Отчисления“ инструмент:
В этом профиле я подождал, пока приложение успокоится, постучал по кнопке «Mark Generation» (в результате «Generation A», первый флаг на моей временной шкале). Затем я подошел к точке зрения, а затем уволил ее и снова «Mark Generation», получив «Generation B». Столбец «Рост» говорит мне, что между поколениями А и В было использовано 100 КБ, но не было выпущено. Но меня это не беспокоит, потому что может существовать некоторый внутренний кеш iOS для элементов UIKit. Итак, я повторяю этот процесс еще раз, чтобы получить «Generation C». Теперь это интересно, теперь сообщается о росте всего лишь 8.26kb, что незначительно. Это, в сочетании с чистым веществом здоровья от инструмента «Утечки», заставляет меня чувствовать себя неплохо в отношении риска серьезных проблем с памятью.
Теперь давайте контрастировать, что с какой-то код, который имеет серьезно проблематичным «сильный опорный цикл»:
Теперь это совершенно иная картина, несмотря на то, что процесс был тот же «присутствует и отклонить ", повторяется дважды. Сейчас я говорю, что у меня был рост в 14 млн. Между поколениями, и, что более важно, я вижу отчетливо кривую роста. Замечательно то, что в то время как инструмент Allocations явно ломает серьезную проблему, инструмент «Утечки» ничего не сообщает.
Теперь на практике реальный опыт работы с инструментом Allocations, вероятно, будет находиться где-то между этими двумя крайностями. У вашего приложения могут быть свои собственные кэши или объекты модели, которые медленно занимают память, но если вы правильно отвечаете на предупреждения о памяти, вы должны восстановить эту память. Откровенно говоря, большинство хорошо разработанных приложений вообще не должны генерировать предупреждения о памяти (обычно это достигается путем правильной настройки кешей, избегая при необходимости imageNamed
, переходя в постоянное хранилище для больших или редко доступных данных и т. Д.). Цель состоит в том, чтобы добраться до точки, где приложение стабилизируется вокруг некоторого разумного уровня выделения базовой памяти, последовательно возвращаясь к этой базовой линии.
Но мы не сможем вам посоветовать вам до тех пор, пока вы не выполните базовое профилирование своего приложения и не диагностируете проблемы с памятью, которые у вас есть.
Ваши контактные данные: Контроллер представления не будет загружать свой вид до первого раза, когда он понадобится, но впоследствии представление будет сохранять выделенную память навсегда, если не появится предупреждение о низкой памяти. Поэтому естественно, что объем памяти увеличивается. Подумайте об этом как к кешированию - не используя память, в то время как никто другой не нуждается в ней, это будет просто неэффективное использование ресурсов. Итак, вы уверены, что память полна объектов, которые вы ожидали удалить? Инструменты расскажут вам, какие объекты используют память, или вы можете поместить NSLog в '- (void) dealloc', если хотите видеть вещи по мере их возникновения. – Tommy
не беспокойтесь об этом, пока ваше приложение не упало из-за утечки памяти. –
@ Томми Нет. Я не уверен (вот почему я спрашиваю). Я использую 'SWRevealViewController' как меню, и все представления внутри него, у меня есть еще несколько над ними над некоторыми внутри, но я представляю их как modalViews. Итак, после вашего комментария, я действительно успокоился :) это мое первое приложение для iOS (я новичок), поэтому я был бы уверен, что все в порядке :) –