Подтвердить что ты не робот

Ошибка утечки памяти в iOS5.0.1

У меня есть следующий фрагмент кода, который я использую для масштабирования изображений. Это в цикле, который создает и истощает пул авторесурсов для каждого прохода. Этот код отлично работает на симуляторе в iOS5.0, в iOS4.3 на iPad или симуляторе, но на iOS5.0.1 на iPad1, после 50-60 проходов, drawInRect начинает потреблять память, которая никогда не будет выпущена. Я вызывал это из вторичного потока, но теперь вызываю операции масштабирования в основном потоке.

UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Я делаю что-то неправильно или это ошибка iOS5.0.1?

Обновление: Я пробовал много тестов. Я смог доказать, что тот же самый код, скомпилированный с XCode 4.0, отлично работает на том же iPad. Тот же код, скомпилированный с XCode 4.2.1, вызывает состояние нехватки памяти. Эта процедура масштабирования вызывается в фоновом потоке. Я написал другую процедуру масштабирования с использованием графических вызовов нижнего уровня. Он не протекает с XCode 4.0, но протекает, когда в моем приложении с XCode 4.2.1. Точное одно и то же подпрограмму и дерево вызовов, запущенное в автономном проекте, не похоже на утечку (большую) память на XCode 4.2.1. Я жду, чтобы услышать от Apple об этом. В то же время мне нужно использовать XCode 4. Единственное установочное изображение, которое у меня есть, требует Snow Leopard, что означает, что я использую свою старую старую машину на 5,5 лет. Благодаря

Обновление 1/2012 Это похоже на то, что приложение запускается из XCode. Тот же исполняемый файл, запущенный на iPad, не обнаруживает утечки. Другое приложение с одной и той же программой не обнаруживает утечки.

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

Обновление 6/2012 Несмотря на то, что Apple прислала минимальный проект, который воспроизвел проблему, они заявляют, что не могут воспроизвести проблему и не добиваются какого-либо прогресса в ней.

4b9b3361

Ответ 1

Я считаю, что НАКОНЕЦ нашел причину утечки памяти. Я обнаружил подобное поведение при выполнении некоторых вводов Core Data. Looping, создавая много выпущенных объектов. При запуске на iPad использование памяти увеличивается, хотя утечки не наблюдается, пока приложение не выйдет из памяти. Но при запуске с устройства он работает без проблем.

Мне пришло в голову, что это что-то о том, как его начать с Xcode. Должна быть настройка отладки в проекте.

Оказывается, проблема была вызвана тем, что NSZombieEnabled при отладке. Чтобы отключить этот параметр в Xcode 4, щелкните правой кнопкой мыши на схемах, например app > targetDevice, отредактируйте схему, выберите вкладку Debug, вкладку arguments. Чтобы включить NSZombieEnabled, создается переменная среды с этим именем со значением YES и переменная включена. Чтобы отключить его, снимите флажок.

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

Как только я отключил это, мое приложение, которое раньше стремительно увеличивалось более чем на 115 МБ до того, как его убили на iPad1, теперь с радостью сидит на скорости 24 МБ без утечки памяти.

Ответ 2

Указанный вами код не должен вызывать утечки. Утечка определенно где-то еще.

Я бы рекомендовал следующие два шага:

  • Отправьте код, который вы используете для управления пулом автозапуска.
  • Убедитесь, что вы выполняете эти строки кодов в основном потоке (документация Apple указывает, что это действительно важно).