утечки памяти, возникающие после многократной загрузки

У меня, по крайней мере, для меня, странный случай: у меня есть относительно простая программа, которая загружает XML-файл из Интернета, анализирует его и записывает данные в массив словарей. Каждый словарь представляет собой строку в таблице. Программа работает нормально, и если я присоединяю симулятор к приборам и загружаю список, утечки памяти нет.

А теперь самое странное: есть кнопка для перезагрузки списка пользователем. Если вы ее нажмете, предыдущие данные будут очищены, XML будет загружен и проанализирован, и так далее. Если я нажму эту кнопку, я все равно не смогу найти утечку памяти. Но если я нажму дважды, внезапно повсюду утечки. Я очень озадачен, почему внезапно возникают утечки там, где раньше их не было (утечки появляются только в том случае, если один и тот же код запускается дважды)? Это особенно странно, поскольку я, например, использую часть образца XMLParser от Apple, мой код является копией их кода 1: 1, но когда я дважды запускаю синтаксический анализатор, инструменты сообщают об утечке в этом коде.

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

Всего наилучшего, Робин


person Robin    schedule 25.01.2010    source источник
comment
И мы должны волшебным образом угадать, что его вызывает?   -  person Anon.    schedule 26.01.2010
comment
Нет, вы не должны этого делать. Мне просто было интересно, была ли у кого-то еще эта проблема ранее и действительно ли утечки являются утечками (но я думаю, что это так). Утечки довольно многочисленны и широко распространены, поэтому мне пришлось бы выложить половину проекта, что вам тоже не поможет.   -  person Robin    schedule 26.01.2010
comment
опубликуйте код ... по крайней мере, код обработчика кнопок.   -  person AndersK    schedule 26.01.2010
comment
Что вы используете для обнаружения этих утечек?   -  person Anon.    schedule 26.01.2010


Ответы (2)


Здесь действительно недостаточно информации, чтобы дать твердый ответ.

Тем не менее, похоже, что вы неправильно интерпретируете результаты инструмента обнаружения утечки памяти, который вы используете. Если он сканирует граф объектов в поисках потерянных объектов, он может не заметить, что объект потерял, пока вы не перезагрузите. Это потому, что может существовать статическая кэшированная ссылка на корень графа объекта в одной из сторонних библиотек, которые вы используете (или в вашем собственном коде). После повторной загрузки кэшированная ссылка перемещается в на новый корневой объект и на все старые объекты больше не ссылаются никакие корневые переменные (локальные переменные в стеке вызовов или статические переменные), и поэтому они «осиротели» и «просочились».

person David Gladfelter    schedule 25.01.2010
comment
Большое спасибо, это звучит очень интересно. Я полностью понимаю, что вы не можете дать подробное решение, пока у вас нет кода, но есть ли способ определить, используются ли такие кешированные объекты или нет (например, есть ли возможность отключить это кеширование?) Спасибо очень благодарен за ваш вклад! - person Robin; 27.01.2010

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

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

person mr-sk    schedule 25.01.2010