gpt4 book ai didi

objective-c - 达到内存限制时 NSCache 崩溃(仅在 iOS 7 上)

转载 作者:IT王子 更新时间:2023-10-28 23:35:14 26 4
gpt4 key购买 nike

我们在我们的应用程序中使用 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 被调用。从那时起,计时器每 100 毫秒调用一次 -(void)addImageToCache:(id)sender。在这个方法中,会生成一个 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];

}
}

最佳答案

虽然 NSCache 从未响应内存警告,但我发现它通常会响应真正的内存压力。无法响应内存警告总是有点烦人(例如,您不能只使用“模拟内存警告”来测试应用程序在内存压力下的行为)。

话虽如此,我看到了您描述的相同行为。 iOS 7 似乎改变了 NSCache 的行为。

就我个人而言,我只是有一个简单的 NSCache 子类,它会在收到 UIApplicationDidReceiveMemoryWarningNotification 通知时删除所有对象:

@implementation AutoPurgeCache

- (id)init
{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
}
return self;
}

- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
}

@end

关于objective-c - 达到内存限制时 NSCache 崩溃(仅在 iOS 7 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com