在iPhone上,我使用NSURLRequest对一大块数据执行HTTP请求.对象分配峰值,我相应地分配数据.当我完成数据后,我会相应地释放它 - 但是仪器没有显示任何已释放的数据!
我的理论是,默认情况下,HTTP请求被缓存,但我不希望我的iPhone应用程序缓存这些数据.
有没有办法在请求后清除此缓存或阻止任何数据首先被缓存?
我尝试过使用下面记录的所有缓存策略:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
但似乎没有什么可以释放记忆!
通常,更容易创建这样的请求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
然后创建连接
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
并在委托上实现连接:willCacheResponse:方法.刚刚返回nil应该这样做.
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { return nil; }
当我从twitter请求信息时,我在我的应用程序中遇到了同样的问题.在我的情况下,我不需要保留这些凭据,所以我使用下一个代码简单地擦除它们:
- (void) eraseCredentials{ NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage]; NSDictionary *allCredentials = [credentialsStorage allCredentials]; //iterate through all credentials to find the twitter host for (NSURLProtectionSpace *protectionSpace in allCredentials) if ([[protectionSpace host] isEqualToString:@"twitter.com"]){ //to get the twitter's credentials NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace]; //iterate through twitter's credentials, and erase them all for (NSString *credentialKey in credentials) [credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace]; } }
我希望它适用于某人:)
如果您使用NSURLConnection,请查看委托:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
回报价值
存储在缓存中的实际缓存响应.委托可以不修改返回cachedResponse,返回修改后的缓存响应,如果没有为连接存储缓存响应,则返回nil.
如果你正在使用NSURLSession
,另一个防止Cache.db
在app的Caches
目录中创建写入iOS的请求和参数的解决方案是将会话NSURLCache
的配置设置为0大小的内存和0大小的磁盘缓存,例如
let configuration = URLSessionConfiguration.default configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) let session = URLSession(configuration: configuration)
或者如上所述设置在全局缓存级别
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
据推测,磁盘大小为0会阻止iOS写入磁盘,但如果你有策略,reloadIgnoringLocalCacheData
那么你可能对内存缓存也不感兴趣.
注意这将阻止任何Caches/Cache.db
(请求和响应)或Caches/fsCachedData/
文件夹(响应数据)的创建.我们决定出于安全目的在应用程序中采用这种方法,因为我们不希望我们的请求永远存储在磁盘缓存中.
如果有人知道有一种方法可以停止请求缓存,但保持从iOS URL加载机制缓存响应数据,我有兴趣知道.(根据我的判断,没有关于此的API或官方文档)
如果不是特定于单个请求(U想要为整个应用程序禁用缓存),则最好选择.在app delegate中添加此代码或根据您的需要在任何地方
int cacheSizeMemory = 0*4*1024*1024; // 0MB int cacheSizeDisk = 0*32*1024*1024; // 0MB NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; [NSURLCache setSharedURLCache:sharedCache];