UIDatePicker Утечка памяти с ARC - PullRequest
2 голосов
/ 27 января 2012

Я делаю приложение, которое имеет несколько контроллеров представления с элементами управления UIDatePicker.

Получив много предупреждений о памяти, я много отлаживал причину. Используя инструменты, я смог увидеть, что всякий раз, когда появляется контроллер представления, содержащий UIDatePicker, использование памяти увеличивалось на 2-3 МБ. В конечном итоге это приводит к предупреждению памяти. Несмотря на то, что я могу многое сделать здесь, и после переписывания этих функций наблюдается значительное снижение числа сбоев, я все еще не удовлетворен этим поведением и хочу его исправить.

UIDatePicker является частью файла XIB. Я пытался извлечь их из XIB и программно добавить их. Это не решает проблему. Я также попытался использовать (поточно-ориентированный) синглтон. Это ограничивает использование памяти только одним экземпляром (таким образом, использование памяти не увеличивается), но я стараюсь по возможности избегать синглетонов. Должен ли я просто смириться с этим и использовать синглтон?

Я наблюдаю такое поведение на iOS 5 и 4.3 на всех устройствах, на которых он работает. Я использую ARC, как следует из названия.

Прибор не обнаруживает утечек памяти.

Вот скриншот из инструментов. Каждый шаг в использовании происходит, когда появляется VC, содержащий средство выбора даты. Базовая линия в начале графика составляет 2,3 Мб использования памяти.

http://i.stack.imgur.com/1S7ns.png

ура!

Ответы [ 2 ]

4 голосов
/ 28 января 2012

Кажется, я решил свой вопрос. Так как это был inputView, у меня также был UIToolbar с кнопкой «Done» в качестве inputAccessoryView.

Так что теперь я создаю их программно в viewWillAppear. В viewWillDisappear я установил для inputView UITextField и inputAccessoryView значение nil, а для панели выбора даты и выбора даты - nil.

Их больше нет в файле XIB. Кажется, это работает очень хорошо - объем памяти увеличивается на 3 МБ, а затем уменьшается, как только исчезают представления. Теперь приложение работает стабильно на 10 МБ оперативной памяти - иногда оно достигает 15 МБ, но очень редко.

Спасибо за помощь sudo rm -rf и Rob - анализ heapshot помог попытаться разобраться в этом.

4 голосов
/ 27 января 2012

Инструмент, который вы хотите использовать здесь, называется heapshot .Это поможет вам сузить типы объектов, которые неправильно удерживаются.Как отмечает @sudo, проблема, вероятно, в вашем делегате, а не в самом средстве выбора даты.Вы, вероятно, не «протекаете» в самом строгом смысле этого слова.Вы, вероятно, просто держитесь за память, которую вы не имели в виду (которая выглядит как утечка).

Вам следует внимательно посмотреть, есть ли у вас какие-либо убедительные ссылки.Есть ли у вас объекты, которые имеют сильную ссылку на свой делегат, например?Как правило, это приводит к сохранению цикла (который никогда не будет выпущен в рамках ARC).Heapshot может помочь вам найти эти объекты.

...