Я пишу приложение для iPhone, которое начинает занимать память сразу после запуска и просто продолжает занимать больше памяти. Причина, по-видимому, заключается в том, что я включил тесную внутреннюю петлю в то, что я хотел бы запустить в течение длительного времени. Не волнуйтесь, оно не должно быть частью пользовательского интерактивного приложения, оно просто для тестирования внутреннего кода.
В любом случае, при поиске stackoverflow я обнаружил, что должен использовать свой собственный NSAutoReleasePool, потому что основной не достигается. Кроме того, я обнаружил, что должен отказаться от использования авто-релиза. Я сделал обе эти вещи, хотя я не смог избавиться от всех вызовов автоматического выпуска. Однако это не решает проблему. Теперь мое количество распределений (согласно инструменту Распределения инструментов) перемещается в виде треугольной волны, предположительно из-за истощения пула, но количество распределений и общее количество байтов постоянно увеличивается. Это увеличение использования памяти также отражается в мониторе активности. Распределяемые объекты попадают под все виды типов, включая Malloc, CFString, NSConcreteMutableData; в основном много базовых библиотечных классов и множество объектов моего кода.
Это в основном то, что я делаю:
for (int i=0; i<1000; i++) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
... do lots of stuff
[pool drain];
}
Есть идеи, почему это происходит? У меня нет никаких утечек памяти в соответствии с инструментом Leaks, и у меня нет набора NSZombieEnabled или каких-либо других аргументов на этот счет.
Спасибо
UPDATE:
Я только заметил, что некоторые утечки памяти обнаруживаются, когда я использую пул автоматического выпуска, которых нет, когда я не использую пул. Странно ... Может быть, это помогает указать на проблему. Сейчас я пытаюсь отследить эти утечки, но пока они не выглядят как утечки в моем коде, но они имеют смысл, если пул фактически не освобождает их.
UPDATE:
Хорошо, разобрался, и это было вызвано несколькими вещами. Во-первых, я не выпускал должным образом объекты, которые содержали ссылки друг на друга, поэтому их никогда не выпускали. Во-вторых, все еще есть утечки памяти, но они есть в базовых классах. Я где-то нашел ответ, предполагающий, что это не удивительно, особенно при работе в симуляторе, так что я не буду сильно беспокоиться об этом. Надеюсь, это кому-нибудь пригодится.