UIImageView / UIImage «Memory Tag 70» освобождает время при прокрутке - PullRequest
1 голос
/ 06 января 2012

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

Поскольку дорого и не нужно добавлять все UIImage сразу, в настоящее время я лениво загружаю изображения (pageIndex-1 + pageIndex + pageIndex + 1, используя NSOperationQueue FYI) и удаляю все другие UIImageViews.

Использование памяти, полученное от Instrument, приемлемо при обычном использовании, но я обнаружил, что если я продолжу прокручивать (непрерывно переключаясь между 30 страницами), грязная память будет увеличиваться, особенно «Memory Tag 70», который, я считаю, является необработанным данные из UIImage. После того, как я перестану трогать приложение в течение 3 ~ 4 секунд, ВСЕ "Memory Tag 70" будет автоматически выпущен.

Я поместил NSLog в нескольких местах, и я уверен, что UIImageViews удаляются из его суперпредставления, когда оно выходит за пределы "диапазона отображения".

Прокрутка мешает основному циклу освободить эту память? Что я мог сделать, чтобы предотвратить такое состояние? Спасибо! enter image description here

p.s Огромное падение Dirty Size - это момент, когда я прекращаю прокручивать.

Ответы [ 3 ]

2 голосов
/ 20 января 2012

(Просто предположение, я далек от Xcode для тестирования и предполагаю, что среда не-ARC)

Вместо [otherImageView removeFromSuperview] вы можете использовать

UIImage *image = [otherImageView.image retain];
otherImageView.image = nil;
[image release]; // the image won't go to the main autorelease pool
[otherImageView removeFromSuperview]; // No one has references to otherImageView, so it goes to the autorelease pool

Чтобы изображение не попадало в пул авто-релиза.

2 голосов
/ 09 января 2012

Я бы попробовал следующее:

  1. Не используйте [UIImage imageNamed:] для загрузки изображений.Это накапливается в теге памяти 70.
  2. Используйте методы экземпляра initWithContentsOfFile: и автоматически высвобождайте его.Примечание. Это означало бы потерю преимущества кэширования [UIImage imageNamed:].Но попробуйте.
  3. Используйте @autoreleasepool (вместо NSAutoreleasePool) вокруг кода, где происходит распределение изображений.Может использоваться независимо от ARC.
0 голосов
/ 20 января 2012

Из графика видно, что уровни потребления памяти отключены, что согласуется с кэшированием и последующим освобождением изображений, когда прокрутка прекращается (возможно, через внутренний автоматический выпуск в просмотре прокрутки).Это кеширование и наращивание памяти, вероятно, делают вашу прокрутку более плавной.Если вам действительно нужно предотвратить наращивание памяти, то вам нужно будет вручную выделять и выпускать изображения (повторяя предложение AnlmlsH об отказе от imageNamed).

Но устранение кэширования может привести к резкой прокрутке .... классическое время/ space tradeoff, и вам нужно определить, какой из них более важен для случая вашего приложения.

...