NSAutoReleasePool, кажется, не работает - PullRequest
0 голосов
/ 08 июня 2011

Я пишу приложение для 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: Хорошо, разобрался, и это было вызвано несколькими вещами. Во-первых, я не выпускал должным образом объекты, которые содержали ссылки друг на друга, поэтому их никогда не выпускали. Во-вторых, все еще есть утечки памяти, но они есть в базовых классах. Я где-то нашел ответ, предполагающий, что это не удивительно, особенно при работе в симуляторе, так что я не буду сильно беспокоиться об этом. Надеюсь, это кому-нибудь пригодится.

1 Ответ

1 голос
/ 08 июня 2011

Это может быть вызвано определенным системным кэшированием, т. Е. ImageNamed и определенные URL-вызовы будут фактически кэшироваться системой и, следовательно, не являются утечками, но также и ничем, что вы можете освободить вручную.Обычно есть лучшие способы справиться с такими вещами, например, создать собственное кэширование изображений, которое вы можете очистить ...

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