Управление памятью iOS — проблема с ростом ImageIO_PNG_Data и CoreAnimation

У меня проблемы с приложением, в котором память продолжает расти каждый раз при переходе к определенному представлению. Процесс воссоздания этого увеличения памяти:

  1. Показать контроллер просмотра входа пользователя
  2. Контроллер Push Home View
  3. Контроллер представления настроек push-уведомлений
  4. Выйти из системы (кнопка в контроллере представления настроек) — открывается в контроллере просмотра входа пользователя.
  5. Войти и нажать Home View Controller

Каждый раз, когда я нажимаю на контроллер Home View (хотя я подтвердил, что предыдущий освобождается), память подскакивает на 6+ МБ. Я профилировал приложение и обнаружил одну явную проблему с категориями VM:ImageIO_PNG_Data и VM:CoreAnimation в Allocations.

введите здесь описание изображения

Некоторые из них происходят в классе, который я использую под названием Masking View, который рисует указанную часть слоя ниже этого вида. Код, используемый для рисования, приведен ниже:

//Draw project image
CGRect newRect = self.frame;
if (useCustomFrame){
    newRect = customFrame;
}

CGImageRef image = CGImageCreateWithImageInRect([self.projectedImage CGImage], newRect);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, rect, image);

// Release Context
CGImageRelease(image);

person Stephen Donnell    schedule 06.04.2014    source источник
comment
Попробуйте освободить контекст. CGContextRelease (контекст);   -  person Roecrew    schedule 06.04.2014
comment
Освобождение контекста приводит к ошибке, я думаю, из-за чрезмерного выпуска, так как это ARC: CGContextResetState: неверный контекст 0x9296780. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.   -  person Stephen Donnell    schedule 06.04.2014
comment
Вы хотите запустить его с помощью инструмента Leaks, а не Allocations. Самая большая утечка также, как правило, не является причиной утечки.   -  person tc.    schedule 06.04.2014
comment
Ранее я профилировал его с помощью Leaks, надеясь что-то найти, но я возвращаю 0 просочившихся объектов. Это, пожалуй, самое большое, что меня сбивает.   -  person Stephen Donnell    schedule 06.04.2014
comment
Проблема может быть не в утечке, а просто в заброшенной памяти. Это означает, что у вас все еще есть действительные ссылки на изображение откуда-то, но оно больше недоступно. Попробуйте выполнить некоторый анализ поколений (также известный как анализ кучи) на вашем домашнем контроллере представления — developer.apple.com/library/ios/documentation/DeveloperTools/   -  person Anurag    schedule 06.04.2014


Ответы (1)


Растущая проблема с памятью в большинстве случаев возникает по двум причинам:

1. Проверьте разрешение изображения, которое вы используете в своем коде, используйте только необходимое разрешение изображения.

Предположим, вы используете размер изображения 40x40 для 1X, 80x80 для 2x и т. д. Затем используйте только необходимое разрешение, не более того.

  1. Убедитесь, что вы используете обновленную библиотеку отложенной загрузки.

Используйте инструмент «Распределение памяти» и проверьте выделение виртуальной машины. Если у вас есть какие-либо IMAGEIO в отношении проблемы, то, безусловно, вы содержите изображение с высоким разрешением в своем NSMainBundle.

Измените размер изображения с высоким разрешением до требуемого разрешения и используйте imageWithContentsOfFile вместо imageName.

person Vinay Vaish    schedule 14.01.2015