Вопрос касательно утечки памяти (снимок экрана с приборами) - PullRequest
0 голосов
/ 26 февраля 2009

Я пытаюсь отсеять свое приложение от утечек памяти. Проблема, с которой я сталкиваюсь, заключается в том, что Instruments сообщает об утечках для объектов, которые я сам не выделил. Теперь я понимаю, что эти объекты могут быть созданы в результате какого-то другого кода, который я написал, но я не могу найти свой клиентский код где-либо в стеке. Вот снимок экрана с набором виновных объектов, которые, по сообщениям Инструментов, просочились: http://dl -client.getdropbox.com / u / 57676 / screenshots / leakss.png

У кого-нибудь есть какие-либо предложения относительно того, как я могу пойти дальше, чтобы выяснить истинный источник этих утечек и удалить их из приложения?

Ответы [ 6 ]

1 голос
/ 27 февраля 2009

Они очень похожи на утечки, которые появляются в симуляторе. Если вы запустите его со своего iPhone, держу пари, вы больше не видите утечек. Имейте в виду, что симулятор не имитирует истинную среду iPhone. Окончательный ответ - запустить iPhone. Симулятор хорош для тестирования, но перед тем, как приступить к тому, что вы видите в симуляторе, убедитесь, что вы также видите его в iPhone.

1 голос
/ 26 февраля 2009

Чтобы добавить еще один уровень уверенности в эту ошибку, я хотел бы рассмотреть возможность использования статического анализатора LLVM / Clang в вашем коде. Взято с их сайта :

Статический анализатор LLVM / Clang - это автономный инструмент для поиска ошибок в программах на языке C и Objective-C.

Более конкретно, он может проверять количество вызовов alloc, init, release в вашем коде. Это довольно полезно.

Для получения дополнительной информации Джефф Ламарч написал фантастический пост об установке и использовании статического анализатора Clang, здесь .

1 голос
/ 26 февраля 2009

Я не могу найти свой клиентский код в стеке.

Это ничего не значит. Код Apple может выполняться в результате таймеров или событий, инициированных пользователем (касания и т. Д.). Ваш код запускается после кода Apple (например, mouseUp: от Apple вызывает ваш метод действия). Код Apple делает больше, чем просто вызывает ваш код; поэтому не удивительно, что трассировка стека содержит только методы Apple.

Итак, эта утечка, похоже, принадлежит Apple. Вы должны сообщить об ошибке в Радар .

Это относится и к остальным. Посмотрите на трассировку стека; если он не показывает вашего кода (то есть только код Apple), то вы должны сообщить об ошибке. Если ваш код выделил его, то это (вероятно) ваша ошибка, поэтому вы должны найти ее и исправить самостоятельно.

0 голосов
/ 27 февраля 2009

Еще одна вещь, которую нужно проверить: увеличивается ли утечка памяти со временем? Если этого не произойдет, то утечка 200 байтов не будет замечена. Я предполагаю, что суть в том, что в день уходит только так много часов, и вполне вероятно, что за несколько часов кодирования / отладки вы сможете уменьшить объем памяти вашего приложения в 10 или 1000 раз по сравнению с несколькими байтами, которые отображаются как утечка на скриншоте, который вы поставили.

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

- Том

0 голосов
/ 26 февраля 2009

Помните, что ваше приложение может пропускать несколько байтов здесь и там, но если это не влияет на функциональность самого приложения, то это может не быть большой проблемой. Очевидно, что вы не хотите терять память, если можете ей помочь, но я не слышал, чтобы Apple отвергала приложения людей из-за небольших утечек памяти. Хотелось бы исправить это, если бы кто-то был отклонен из-за утечек памяти.

0 голосов
/ 26 февраля 2009

Я видел некоторые посты на эту тему, похоже, это общее разочарование.

У меня есть приложение, которое анализирует файл XML, полученный из веб-службы. Похожая утечка произошла из-за кеша URL.

Я закрыл утечку следующим кодом перед вызовом init в XML-парсере:

[[NSURLCache sharedURLCache] setMemoryCapacity:0]; [[NSURLCache sharedURLCache] setDiskCapacity:0];

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