Цель C / iPhone: нужны «лучшие практики» для отладки ошибок управления памятью - PullRequest
1 голос
/ 13 января 2010

Итак ... Я написал свою первую игру для iPhone, которая состоит из примерно 50 головоломок.

В начале каждой головоломки я создаю несколько строк, различные изменяемые массивы указателей, некоторые из которых указывают на созданные во время выполнения подпредставления. Все сохраненные переменные объявлены как различные свойства класса. Затем в конце головоломки я удаляю подпредставления, освобождаю память, выделенную для указателей, и ноль моих указателей. Затем создайте их снова для следующей головоломки.

И приложение отлично работает для первых 2, 3, иногда 4 головоломок, затем вылетает с на первый взгляд случайными ошибками неверного доступа и т. Д., Которые я пытаюсь отследить. Очевидно, я не совсем там с управлением памятью iPhone:)

Итак, мне нужен совет для отладки? Читаете ли вы каждую строчку кода и записываете ли каждый выделение, каждое подпредставление, какое-то ручное сохранение количества? Должен ли я искать ресурсы и сопоставлять их с выпусками? Или есть другие методы?

Я не ожидаю ответа на мой вопрос, но буду признателен за советы и рекомендации! Спасибо!

Ответы [ 3 ]

4 голосов
/ 13 января 2010

Как уже отмечали другие, статический анализатор очень помогает - в Snow Leopard вы можете просто запустить "Построить и проанализировать" и просмотреть результаты.

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

В XCode откройте элемент «Исполняемые файлы» в браузере проекта, щелкните правой кнопкой мыши по вашему исполняемому файлу и выберите «Получить информацию». Затем перейдите на вкладку «Аргументы», перейдите в нижнюю половину и добавьте новую переменную среды. Назовите его «NSZombieEnabled» и установите значение «YES» - убедитесь, что оно также проверено, хотя оно должно быть по умолчанию, если вы его создаете.

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

Когда вы закончите, вы хотите снять отметку с переменной NSZombieEnabled для вашего исполняемого файла, потому что система не освободит память, пока она установлена.

Отладка этих вещей может быть немного хитрой, потому что вам нужно выяснить, где был выпущен объект, чтобы найти, где он был ошибочно освобожден. Snow Leopard Instruments помогает в этом, потому что Object Alloc работает вместе с NSZombieEnabled, чтобы показать вам трек везде, где были выпущены объекты.

Вы также можете использовать инструмент "Утечки", чтобы найти места, где вы думали, что выпустили объекты, но на самом деле этого не сделали - хотя я обнаружил на практике, что примерно в половине случаев Утечки не будут показывать ничего, потому что в дополнение к утечка, вы также сохранили ссылку на объект, так что Утечки не знают, что у вас действительно есть утечка. Это может быть хорошей идеей - просто посмотреть график выделения объектов и выбрать области, которые поднимаются, не освобождая память, когда вы думаете, что должны.

3 голосов
/ 13 января 2010

Вы запускали статический анализатор над своим кодом? Это должно поймать большинство этих ошибок. В опциях сборки XCode для вашего проекта включите RUN_CLANG_STATIC_ANALYZER.

0 голосов
/ 13 января 2010

Статический анализатор отлично справляется с обнаружением утечек. Я склонен использовать Apple Key A для сборки, которая автоматически выполняет анализ как часть сборки.

Следующим шагом является проверка Instruments . Я рекомендую запустить ваше приложение в Instruments как часть процесса предварительной отправки. Вы можете отслеживать распределение во время работы приложения, проверять утечки, тестировать производительность и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...