3

NSURLCache收到内存警告时清除共享是一种好习惯吗?像这样的东西:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
}

我是否正确地假设这也会不必要地清除磁盘缓存?

如果是这样,是否可以只清除内存缓存?

4

1 回答 1

5

当出现内存警告时,您只需要清除内存缓存而不是磁盘缓存。问题removeAllCachedResponses是它会清除两者。从我的测试来看,这似乎只清除了内存缓存。

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {

    NSURLCache * const urlCache = [NSURLCache sharedURLCache];
    const NSUInteger memoryCapacity = urlCache.memoryCapacity;
    urlCache.memoryCapacity = 0;
    urlCache.memoryCapacity = memoryCapacity;
}

我唯一关心的是线程问题。本文底部有一个脚注。

StackOverflow 上有很多关于通过重新创建来清除 NSURLCache 的建议,但是,我们已经看到,当在重新创建缓存时另一个线程上发生请求时,这会导致偶尔崩溃。因此,我们的建议是在应用程序启动时创建一次缓存,并在适当的时候清除它。

上面的解决方案不会重新创建缓存,但是它可能仍然会遇到同样的问题,我没有对此进行广泛的测试。

于 2014-08-11T09:37:02.660 回答