iOS查看和清理缓存

@interface BWMCachesManager : NSObject

/**
* 获取BWMCachesManager单例
*
* @return 返回BWMCachesManager单例对象
*/
+ (BWMCachesManager *)sharedManager;

/**
* 清理缓存
*
* @return 成功返回YES,否则返回NO
*/
- (BOOL)clearCaches;

/**
* 获取所有缓存文件的大小
*
* @return 如23.11 MB
*/
- (NSString *)getAllTheCacheFileSize;

@end

static BWMCachesManager *_cachesManager = nil;

@implementation BWMCachesManager
{
NSString *_cachesDirPath;
}

  • (instancetype)init {
    if (self = [super init]) {
    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    _cachesDirPath = [cachesPath copy];
    }
    return self;
    }

  • (BWMCachesManager *)sharedManager {
    if (_cachesManager == nil) {
    @synchronized(self) {
    if (_cachesManager == nil) {
    _cachesManager = [[[self class] alloc] init];
    }
    }
    }
    return _cachesManager;
    }

// 清理缓存文件
- (BOOL)clearCaches {
if([self requestCachesFileSize] > 0) {
NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:_cachesDirPath];
for (NSString *file in files) {
NSString *path = [_cachesDirPath stringByAppendingPathComponent:file];
if([[NSFileManager defaultManager] fileExistsAtPath:path]) {
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}
}
return YES;
} else {
return NO;
}
}

  • (NSString *)getAllTheCacheFileSize {
    return [NSString stringWithFormat:@”%.2f MB”,[self requestCachesFileSize]];
    }

// 单个文件的大小
- (long long)fileSizeAtPath:(NSString*) filePath{
NSFileManager* manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:filePath]){
return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];
}
return 0;
}

// 遍历文件夹获得文件夹大小,返回多少M
- (float)requestCachesFileSize {
NSFileManager* manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:_cachesDirPath]) return 0;
NSEnumerator *childFilesEnumerator = [[manager subpathsAtPath:_cachesDirPath] objectEnumerator];
NSString* fileName;
long long folderSize = 0;
while ((fileName = [childFilesEnumerator nextObject]) != nil){
NSString* fileAbsolutePath = [_cachesDirPath stringByAppendingPathComponent:fileName];
folderSize += [self fileSizeAtPath:fileAbsolutePath];
}
return folderSize/(1024.0*1024.0);
}

@end

iOS 平板(iPad)上“清理缓存”通常指的是清除某个应用运行过程中产生的临时数据,例如图片、网页、数据库、视频等缓存文件。由于 **iOS 系统本身不向用户直接暴露“缓存”概念**(不像安卓有“清除缓存”按钮),所以清理缓存的方式主要依赖于: 1. **系统自动管理** 2. **应用内提供清除功能** 3. **开发者在代码中实现缓存清理逻辑** 下面我将从 **用户角度** **开发者角度** 两个层面详细说明如何在 iPad 上清理缓存,并给出 Swift 示例代码。 --- ### ✅ 一、用户如何手动清理 iPad 缓存? #### 方法 1:删除并重装 App(最彻底) - 删除 App 会清除其所有数据缓存。 - 重新安装后应用恢复“干净状态”。 > 设置 → 通用 → iPad 存储空间 → 找到目标 App → 删除应用 ⚠️ 缺点:也会删除登录信息、设置等数据(除非使用了 iCloud 同步)。 --- #### 方法 2:使用 App 内置的“清除缓存”功能 很多 App(如 Safari、微信、微博、Chrome、YouTube 等)会在设置中提供: - “清除历史记录与网站数据” - “清空播放缓存” - “释放存储空间” 📌 示例:Safari 浏览器 > 设置 → Safari → 清除历史记录网站数据 📌 示例:微信 > 我 → 设置 → 通用 → 存储空间 → 清理缓存 --- #### 方法 3:重启设备(轻度缓存释放) - 可释放部分内存中的临时数据(如 View 的渲染缓存、图片解码缓存等) - 不会影响磁盘上的持久化缓存 --- ### ✅ 二、开发者如何为 iPad 应用添加“清除缓存”功能?(Swift + UIKit) 以下是一个完整的 Swift 实现,用于: - 计算当前缓存大小 - 提供一键清除缓存功能 ```swift import Foundation /// 缓存管理工具类 class CacheManager { // MARK: - 获取缓存目录路径 static var cachesDirectory: URL? { FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first } // MARK: - 获取缓存大小(字节) static func getCacheSize() -> UInt64 { guard let cacheURL = cachesDirectory else { return 0 } do { let resources = try FileManager.default.contentsOfDirectory(at: cacheURL, includingPropertiesForKeys: [.fileSizeKey]) var total: UInt64 = 0 for resource in resources { do { let values = try resource.resourceValues(forKeys: [.fileSizeKey]) if let size = values.fileSize { total += UInt64(size) } } catch { print("读取文件大小失败: $resource.lastPathComponent), 错误: $error)") } } return total } catch { print("无法读取 Caches 目录: $error)") return 0 } } // MARK: - 转换字节为 MB/GB 字符串 static func formatBytes(_ bytes: UInt64) -> String { let formatter = ByteCountFormatter() formatter.allowedUnits = .useMB formatter.countStyle = .file return formatter.string(fromByteCount: Int64(bytes)) } // MARK: - 清除所有缓存文件 static func clearCache(completion: @escaping (Bool, Error?) -> Void) { guard let cacheURL = cachesDirectory else { completion(false, nil) return } DispatchQueue.global(qos: .background).async { do { let files = try FileManager.default.contentsOfDirectory(at: cacheURL, includingPropertiesForKeys: nil) for file in files { try FileManager.default.removeItem(at: file) } // ✅ 成功 DispatchQueue.main.async { completion(true, nil) } } catch { // ❌ 失败 DispatchQueue.main.async { completion(false, error) } } } } } ``` --- ### ✅ 三、在 SwiftUI 或 UIKit 中调用示例 #### UIKit 示例(ViewController) ```swift class SettingsViewController: UIViewController { @IBOutlet weak var cacheSizeLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() updateCacheSize() } @IBAction func clearCacheTapped(_ sender: UIButton) { let alert = UIAlertController(title: "确认清除缓存?", message: "这将删除所有临时文件。", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "取消", style: .cancel)) alert.addAction(UIAlertAction(title: "清除", style: .destructive) { _ in self.clearCache() }) present(alert, animated: true) } private func updateCacheSize() { let size = CacheManager.getCacheSize() cacheSizeLabel.text = "缓存大小: $CacheManager.formatBytes(size))" } private func clearCache() { CacheManager.clearCache { success, error in if success { self.updateCacheSize() let alert = UIAlertController(title: "成功", message: "缓存已清除", preferredStyle: .alert) alert.addAction(.init(title: "确定", style: .default)) self.present(alert, animated: true) } else { let msg = error?.localizedDescription ?? "未知错误" let alert = UIAlertController(title: "失败", message: "清除失败: $msg)", preferredStyle: .alert) alert.addAction(.init(title: "确定", style: .default)) self.present(alert, animated: true) } } } } ``` --- ### ✅ 四、额外建议(最佳实践) | 建议 | 说明 | |------|------| | 使用 `URLCache.shared.removeAllCachedResponses()` | 清除 URLSession 的网页资源缓存 | | 图片库缓存单独处理 | 如 SDWebImage、Kingfisher 需调用 `.clearDisk()` | | 控制最大缓存大小 | 自动清理超过阈值的旧文件(LRU 策略) | | 显示进度条或提示 | 用户体验更佳 | --- ### ✅ 总结 | 方式 | 是否推荐 | 说明 | |------|----------|------| | 删除 App | ✅ 彻底但副作用大 | 清除一切数据 | | 应用内清除缓存 | ✅✅ 推荐 | 安全可控,用户体验好 | | 开发者主动管理缓存 | ✅✅✅ 最佳做法 | 结合 LRU、定时清理、容量控制 | > 📝 提示:iPadOS 支持多任务大文件操作,缓存增长更快,建议定期提醒用户清理(如“存储空间不足”时弹窗引导)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值