2014-02-18 3 views
4

Я использую инструменты в проекте ARC (запускаются на устройстве), чтобы убедиться, что я очищаю любую заброшенную память. С этой целью я использую инструмент генерации распределений и снимаю снимки своей кучи за одно и то же действие 10-20 раз. То, что я смущен, - это рост. Некоторое время рост равен 0, а затем другому, кажется, накапливается некоторое количество байтов (никогда не последовательное в диапазоне от нескольких байтов до нескольких килобайт). Но обычно существует как минимум несколько итераций, где рост равен 0.Генерация генераторов кода Xcode

Мой вопрос: если мой рост иногда равен 0, значит ли это, что мое управление памятью правильно? Или у меня все еще есть проблемы, которые мне нужно выведать? Я понимаю, что для «истощения» памяти может потребоваться несколько циклов, но как насчет памяти, которая все еще выделяется и остается даже после> 10 итераций?

Это похоже на более общий вопрос об интерпретации инструментов, поэтому я не использовал какой-либо конкретный код. Кроме того, я обнаружил, что это происходит в различных сценариях моментальной копии кучи: тянуть, чтобы обновить, нажать контроллер просмотра и т. Д.

Редактировать: Я включил snapshot of my Instruments window.

+1

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

+0

Я всегда сохраняю утечки памяти как вид рядом с Allocations, и никто не появляется. Но из того, что я понимаю, у вас все еще могут быть утечки, которые не пойманы инструментами. – dragonflyesque

ответ

3

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

Увеличение, которое вы видите (от нескольких байтов до нескольких килобайт), скорее всего, от операционной системы или фона. Apple-код делает все, чтобы попытаться управлять задачами, которые вы выполняете. Один простой пример - если вы впервые открываете клавиатуру Apple, выделяете для нее память, которая никогда не выпускается, поэтому на итерации вы увидите «пропущенную» память, которую вы не создали. Все, что у вас есть, - это код фона, который запускается Apple, и вы не можете определить, что он хочет делать с памятью. Это может быть кеширование конкретных вещей, которые делаются часто, чтобы в следующий раз он работал быстрее. Вся философия Apple - это плавные приложения, поэтому пользовательский опыт - это лучшее, что может быть. То, что ОС делает в фоновом режиме, чтобы сделать это, может быть прерывистым и может вызвать неизданную память.

Проверьте кучи-снимки для объектов, которые были выделены и не выпущены. Если вы можете отслеживать эти объекты в своем коде, тогда исправьте его, если вы не можете, то, скорее всего, это распределение ОС, которое можно или не может избежать. Как я сказал минут назад, если вы получаете много 0, то я бы не стал беспокоиться об этом из-за этого прерывистого увеличения ОС.

+0

Спасибо за объяснение Putz1103. Тогда это означает, что если я получу, скажем, 1 0-итерация роста на 5 итераций с положительным ростом, у меня, вероятно, есть проблема? (т. е. большинство снимков кучи имеют рост). – dragonflyesque

+0

Я нашел этот комментарий от cocoabuilder из b.bum в: [heapshot analysis, чтобы найти утечки памяти] (http://www.cocoabuilder.com/archive/cocoa/294532-heapshot-analysis-to-find-memory-accretion- leaks.html): «В общем, то, что вы ищете, - это любая итерация с выделениями из ZERO. Если вы видите хотя бы одну итерацию - один образец с кучей снимков - с нулевым распределением, это означает, что код, который вы непосредственно тестируете (в данном случае новый документ, закрытый документ) ** напрямую не вызывает постоянных выделений **. " – dragonflyesque

+0

Таким образом, это звучит как общий консенсус (или, по крайней мере, основанный на 2-х человек), который имеет хотя бы небольшое количество итераций с нулевым ростом, означает, что вы делаете нормально по памяти. Я доволен этим. – dragonflyesque

Смежные вопросы