Утечка памяти drawInRect на iOS5.0.1 - PullRequest
12 голосов
/ 23 ноября 2011

У меня есть следующий фрагмент кода, который я использую для масштабирования изображений.Это находится в цикле, который создает и истощает пул автоматического выпуска для каждого прохода.Этот код отлично работает в симуляторе в 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 отправила минимальный проект, который воспроизвел проблему, они утверждают,чтобы иметь возможность воспроизвести проблему и не добиваться прогресса в этом.

Ответы [ 2 ]

4 голосов
/ 26 августа 2012

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

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

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

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

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

2 голосов
/ 27 мая 2012

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

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

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