iOS 10+ 敏感数据内存存储教程求助
嘿,刚好我对Core Data内存存储这块很熟,而且也能给你补充几个其他适合iOS 10+的内存敏感数据存储方案,帮你解决问题~
Core Data 内存存储的配置方法
你说的没错,Core Data确实支持纯内存的存储选项,只是很多教程默认讲的都是磁盘持久化的SQLite类型。关键就是把持久化存储的类型指定为NSInMemoryStoreType,具体步骤和代码示例如下:
- 在初始化
NSPersistentContainer的时候,自定义NSPersistentStoreDescription,把它的type属性设置为内存存储类型 - 把这个自定义的描述赋值给容器的
persistentStoreDescriptions数组,再加载存储
import CoreData lazy var persistentContainer: NSPersistentContainer = { // 替换成你的数据模型名称 let container = NSPersistentContainer(name: "YourDataModel") // 创建内存存储描述 let inMemoryStoreDescription = NSPersistentStoreDescription() inMemoryStoreDescription.type = NSInMemoryStoreType // 覆盖默认的存储描述 container.persistentStoreDescriptions = [inMemoryStoreDescription] container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { // 根据你的需求处理错误,这里用fatalError只是示例 fatalError("Core Data内存存储加载失败: \(error), \(error.userInfo)") } }) return container }()
这样配置后,Core Data的所有操作都只会在内存中进行,不会生成任何磁盘文件,App重启后数据就会被清除,完全符合你存储敏感数据的需求。
其他适合内存存储敏感数据的方案
除了Core Data,还有几个更轻量的内存存储方式,适合不同场景:
- NSCache:苹果官方提供的缓存类,专门用于内存存储,系统在内存不足时会自动清理缓存内容。注意它不是线程安全的,使用时需要加锁保护:
import Foundation let sensitiveCache = NSCache<NSString, NSObject>() // 存数据 sensitiveCache.setObject(yourSensitiveObject as NSObject, forKey: "sessionToken" as NSString) // 取数据 let token = sensitiveCache.object(forKey: "sessionToken" as NSString)
- 自定义单例内存存储:如果需要更灵活的控制,可以自己写一个单例类,用字典或数组存敏感数据,全程在内存中,还能自己实现线程安全:
class SensitiveDataManager { static let shared = SensitiveDataManager() private var storage: [String: Any] = [:] private let accessLock = NSLock() // 私有初始化,防止外部创建实例 private init() {} func save(_ value: Any, forKey key: String) { accessLock.lock() storage[key] = value accessLock.unlock() } func retrieve(forKey key: String) -> Any? { accessLock.lock() let value = storage[key] accessLock.unlock() return value } func clearAll() { accessLock.lock() storage.removeAll() accessLock.unlock() } } // 使用示例 SensitiveDataManager.shared.save("userSession123", forKey: "sessionToken") let token = SensitiveDataManager.shared.retrieve(forKey: "sessionToken")
注意事项
- 所有内存存储的数据都会在App退出、崩溃或者系统回收内存时丢失,所以如果需要持久化备份敏感数据,建议结合Keychain(毕竟Keychain是专门存敏感数据的磁盘存储,安全性高),但如果完全不想碰磁盘,就只用内存方案。
- 要避免不小心把内存中的敏感数据序列化到磁盘(比如不小心把对象存到User Defaults或Plist里),一定要确保所有操作都只在内存中进行。
内容的提问来源于stack exchange,提问作者PruitIgoe
相关产品推荐
相关产品推荐

