删除UserDefaults.standard存储的图片数据后存储空间未释放如何解决
问题根因
你遇到的存储空间没有释放的问题有两个核心原因:
- 你只删除了
petPhoto1对应的key,存储图片时同步写入的doesImageExist1标识key没有被删除,这部分数据还留在UserDefaults中 - UserDefaults本质是将所有数据写入一个plist格式的本地文件,你将对应key设为nil时,系统只是标记该key失效,不会立刻触发plist文件的重写压缩,已失效的图片数据还会作为冗余内容留在文件中,因此系统统计的文稿与数据大小不会立刻变化。
解决方法
临时修复
- 完整删除所有相关key,并强制UserDefaults立即同步写入:
UserDefaults.standard.set(nil, forKey: "petPhoto1") UserDefaults.standard.set(nil, forKey: "doesImageExist1") // 强制触发立即写入 UserDefaults.standard.synchronize()
注:synchronize方法虽已被苹果标记为不推荐使用,但目前仍可用来强制触发UserDefaults的立即写入操作
- 如果执行后存储空间仍未释放,可以手动触发plist文件重写清理冗余:
// 先备份所有需要保留的配置 let backupDict = UserDefaults.standard.dictionaryRepresentation() // 清空当前应用的整个UserDefaults域 UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) // 回写需要保留的配置(过滤掉你要删除的两个key) for (key, value) in backupDict { if key != "petPhoto1" && key != "doesImageExist1" { UserDefaults.standard.set(value, forKey: key) } } UserDefaults.standard.synchronize()
永久最优方案
不要将图片这类体积较大的资源存储到UserDefaults中,UserDefaults的设计定位是存储少量轻量的配置项,单条数据建议不超过100KB,存储大文件会导致读写性能下降、冗余空间无法及时释放等问题。
正确的实现逻辑是:
- 将UIImage转成JPG/PNG数据后写入沙盒的Documents/Library目录
- 仅在UserDefaults中存储对应的文件路径/文件名
- 删除图片时直接删除沙盒中的对应文件,存储空间会立刻释放
内容的提问来源于stack exchange,提问作者user12744379
相关产品推荐
相关产品推荐

