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

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

Почему я могу обнаружить одну утечку памяти при использовании инструментов и моего устройства, но не при использовании симулятора iPhone? Я понимаю, что это вопрос высокого уровня, но я не думаю, что публикация кода в любом случае поможет (довольно много кода ...).

И можно ли заставить инструменты указывать на исходный код, где, по их мнению, находится утечка? Я могу сделать это при использовании симулятора, но похоже, что он не работает при использовании его для устройства (объекты представлены адресом (я предполагаю), при запуске для симулятора он видит, что это за объект, проблемы с настройкой ?)

Заранее спасибо!

С уважением, Никлас

Обновление: может ли это иметь какое-то отношение к тому, что OSX имеет автоматическую сборку мусора, а iOS - нет?


person Nicsoft    schedule 19.07.2010    source источник


Ответы (2)


Доверяйте только устройству. Это то, что ваш пользователь будет использовать для запуска вашего приложения.
Не доверяйте симулятору.
В качестве демонстрации я просто намеренно добавил утечку в проект. Утечка не была обнаружена в симуляторе, но обнаружилась на устройстве, как и ожидалось.
Симулятор - это всего лишь симулятор. Может быть полезно работать быстрее, но никогда не заменяет устройство.

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



Еще несколько полезных советов:

Для более плавного сеанса отключите «Автоматическую проверку утечек» и вручную нажмите кнопку «Проверить наличие утечек сейчас», когда это необходимо.

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

Если вам нужна дополнительная информация о том, как использовать инструменты для поиска утечек, прочтите этот документ Apple: Руководство пользователя инструментов: встроенные инструменты и и руководство пользователя инструментов Данные> Поиск утечек памяти
Вы также можете посмотреть видео о сессиях, связанных с WWDC.
Если вы все еще не понимаете, откуда произошла утечка, пришло время (повторно) прочитать Руководство по программированию управления памятью.

Благодарим вас за желание отправить приложение без утечек. С iOS 4 это сейчас как никогда важно.

person Guillaume    schedule 20.07.2010
comment
Спасибо за Ваш ответ! Я уже использовал Build and Analyze, это помогло мне найти некоторые утечки. Но, как часто бывает, что-то исправляешь, и другая проблема исчезает. Я просто чистил код (в основном NSLogs и комментарии), а затем утечка памяти исчезла ... И не все ли люди пытаются исправить утечки памяти ...? (На этот вопрос не нужно отвечать ...;)) - person Nicsoft; 21.07.2010

Если вы еще не взглянули на удобную опцию «Построить и проанализировать» в меню сборки. Он запустит статический анализатор, который в целом отлично справляется. Если ничего не получится, вы можете некоторое время просмотреть видеоролики сеанса WWDC на Instruments.

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

person Nick    schedule 20.07.2010
comment
Спасибо за ответ. Я выполнил сборку и анализ, это немного помогло мне, но также отметило некоторые ненужные действия (например, при выделении нового объекта, изменяемого внутри предложения if, где фактическая переменная определяется перед предложением if. Затем возвращается объект с помощью return [переменная autorelease]. Он обязательно будет размещен раньше.). - person Nicsoft; 21.07.2010