我有同樣的問題,但在一些不同的情況下: 在較舊的設備(iPhone 4S或更舊版本)上,應用程序通常在操作系統獲取後臺進程期間被終止。可能會釋放記憶。在這種情況下,tmp文件被保留(和未被跟蹤)。下一次該應用程序有機會獲取,創建新文件......並且這個循環持續進行,直到用戶認識到該應用程序使用4GB的存儲空間 - 並將其刪除。
我還沒有找到完美的解決方案還沒有 - 即使我設置了後臺配置的-NSURLSessionConfiguration Urlcache文件到一個自定義(文件說,這是默認無)與路徑相同的目錄(defaultCacheDir/com.apple .nsurlsessiond/...)被使用 - 但是當我確定沒有下載正在進行的時候,做了一個清理方法並使用它。
+ (BOOL)clearCache:(NSError * __autoreleasing *)error
{
__block BOOL successOnLegacyPath = NO;
__block NSError *errorOnLegacyPath = nil;
NSString *cacheDirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSArray *allSubPaths = [[NSFileManager defaultManager] subpathsAtPath:cacheDirPath];
if (!allSubPaths) {
NSLog(@"No subpaths of cache:\n%@", cacheDirPath);
} else {
[allSubPaths enumerateObjectsUsingBlock:^(NSString *subpath, NSUInteger idx, BOOL *stop) {
static NSString * const kNSURLSessionPathComponent = @"nsurlsession"; // this is a non-documented way, Uncle Apple can change the path at any time
if ([subpath containsString:kNSURLSessionPathComponent]) {
successOnLegacyPath = [[NSFileManager defaultManager] removeItemAtPath:[cacheDirPath stringByAppendingPathComponent:subpath]
error:&errorOnLegacyPath];
if (!successOnLegacyPath) {
NSLog(@"Error while deleting cache subpath:\n%@\nError:\n%@", subpath, errorOnLegacyPath);
}
// First we find is the root > bail out
*stop = YES;
}
}];
}
if (!successOnLegacyPath && !errorOnLegacyPath) {
// Couldn't find the nsurlsession's cache directory
if (error) *error = [NSError errorWithDomain:NSCocoaErrorDomain
code:NSFileNoSuchFileError
userInfo:nil];
// OR
successOnLegacyPath = YES;
}
return successOnLegacyPath;
}
這不是一個解決方案,這是建議,如果沒有下載正在進行中使用。如果正在運行下載並嘗試刪除tmp文件,則未測試發生了什麼。
即使我找到解決方案,以前創建的tmp文件仍然未被跟蹤,所以需要使用這種方法刪除這些文件。
Btw,this似乎是同一個問題 - 沒有結論。