У меня проблема с памятью и изображениями, которые я оживляю. Во-первых, я использую ARC. На моем первом экране у меня есть около 60 изображений для анимации. Я использую этот код для анимации:UIImageView Анимация слишком много потребления памяти
NSMutableArray *images = [[NSMutableArray alloc] init];
int animationImageCount = 61;
for (int i = 1; i < animationImageCount; i++) {
[images addObject:[UIImage imageNamed:[NSString stringWithFormat:@"s-%d", i]]];
}
self.fullAnimatedImage = [UIImage imageNamed:[NSString stringWithFormat:@"s-%d", animationImageCount - 1]];
self.animatedImageView.image = self.fullAnimatedImage;
self.animatedImageView.animationImages = [NSArray arrayWithArray:images];
self.animatedImageView.animationDuration = images.count/30;
self.animatedImageView.animationRepeatCount = 1;
[self.animatedImageView startAnimating];
// since there is no official callback method when UIImageView animation completes,
// we can just call a method after animation time has passed
[self performSelector:@selector(animationFinished) withObject:nil
afterDelay:self.animatedImageView.animationDuration];
Проблема заключается в том, что потребление памяти составляет около 300 Мб и, конечно, он выходит из строя на iPhone 4. Когда я закомментировать эту часть кода, потребление памяти составляет около 40 МБ, ничего страшного. Я пробовал устанавливать свойство изображения в nil и ничего. Я попытался поместить его в @autoreleasepool {}
, но он не выпускает его содержимое. У вас есть идеи, как оптимизировать это?
Что такое fullAnimatedImage? Когда вы уже задали массив изображений для анимации, вы снова задали изображение для изображения? –
Да, вы правы, мне это не нужно. Проблема в том, что нельзя использовать метод fromPath из UIImage, потому что я использую xcassets, и этот метод не кэширует изображения. – Flipper
Какова продолжительность анимации? Половина секунды для каждого изображения? Было бы проще/лучше использовать таймер для переключения между изображениями? Таким образом, вам не нужно хранить фактические изображения в памяти. Вы можете просто загрузить их по одному. В качестве альтернативы, вы могли бы обернуть эту анимацию как видео или что-то еще и использовать это вместо этого? – Fogmeister