我们在应用程序中使用 NSCache 作为 UIImages。这在小于 7 的 iOS 版本上工作得很好。当发生内存警告时,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 并将其写入缓存。
在装有 iOS 7.0.3 和 512 MB 内存的 iPad Mini 上,它在大约 350 次迭代后崩溃。
在配备 iOS 5 和 512 MB 内存的 iPad 2 上,它也会在某些时候崩溃,但只有在至少 3000 次迭代之后才会发生。 Instruments 显示,每次发生内存警告时,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];
}
}