Сбой NSCache при достижении предела памяти (только на iOS 7)
Мы используем NSCache для UIImages в нашем приложении. Это отлично работает на версиях iOS меньше 7. Когда появляется предупреждение о памяти, NSCache освобождает объекты, как и предполагалось. Однако на iOS 7 наше приложение вылетает вскоре после первого предупреждения о памяти. Таким образом, создается впечатление, что объекты, хранящиеся в NSCache, никогда не освобождаются, но кэш увеличивается до тех пор, пока не произойдет сбой приложения. Профилирование с помощью инструментов подтверждает это подозрение.
Кто-то еще испытывал эту проблему, и вы нашли обходной путь или уже отследили ошибку?
Похоже, у этих ребят была такая же проблема:http://www.photosmithapp.com/index.php/2013/10/photosmith-3-0-2-photo-caching-and-ios-7/
Я создал небольшое приложение для иллюстрации проблемы. Когда кнопка нажата, метод-(IBAction)fillCache:(id)sender
называется. С этого момента таймер звонит-(void)addImageToCache:(id)sender
каждые 100 мс В этом методе UIImage генерируется и записывается в кэш.
На iPad Mini с iOS 7.0.3 и 512 МБ памяти происходит сбой после ~ 350 итераций.
На iPad 2 с iOS 5, а также с 512 МБ памяти он также в какой-то момент вылетает, но только после как минимум 3000 итераций. Инструменты показывают, что количество экземпляров UIImage уменьшается каждый раз, когда появляется предупреждение памяти. Это не так на iOS 7.
- (IBAction)fillCache:(id)sender
{
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(addImageToCache:) userInfo:nil repeats:YES];
}
- (void)addImageToCache:(id)sender
{
@autoreleasepool {
CGRect rect = CGRectMake(0, 0, 500, 500);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSString *poolKey = [NSString stringWithFormat:@"junk_%d", count++];
[self.cache setObject:image forKey:poolKey];
}
}