直接回答

我会挑选官方的 KeyChain 服务,因为用户的账号密码归于灵敏数据,删除 App 后 KeyChain 中的数据依然保存,而且能够经过 iCloud 同步。这样,当用户下一次装置时,仍然能够读取到相关数据。

iOS 面试 | 如果要存储用户的账号密码,你会挑选什么计划?

拓宽:常见的耐久化计划有哪些?

Key-Value 类存储计划

这一类存储计划经过 Key 来读写数据

  1. NSUserdefault

    • 特色:支撑基本数据类型(NSString、 NSArray,NSNumber,NSData,NSDate, NSDictionary),也支撑自定义目标(可是要完成 NSCoding 协议,以便进行归档和解档)。它的写操作不是实时的,而是有一个写入 runloop(当然是为了削减 I/O本钱啦)
    • 适用数据:App 配置信息,用户偏好设置以及简单的数据,这些数据都是不灵敏的
  2. MMKV:NSUserDefault(Pro Max版)

    • 特色:原理是 mmap 内存映射,供给一块内存地址给 App 读写,由系统负责将数据写到文件中,crash 也不怕数据丢失;序列化用到的是 protobuf 协议,功能和空间上都有不错的体现
    • 适用数据:读写频繁、功能要求高、不灵敏的数据
  3. NSKeyedArchiver: NSUserDefault 加密版

    • 特色:加密存储,支撑自定义目标(也是要完成 NSCoding 协议, 还要完成 encode 和 decode 两个办法),
    • 适用数据:数据灵敏的,比较复杂的自定义目标数据

数据库类型的存储计划

数据库都支撑自定义类型的目标

  1. 原生 Sqlite:最原始的数据库

    • 特色:C 语言 API,运用繁琐
    • 适用数据:什么数据都行,只要你不怕费事,也不考虑维护本钱
  2. CoreData:Apple 对 Sqlite 的封装数据库

    • 特色:用 Sqlite 进行存储,学习本钱高,功能差,
    • 运用数据:不建议运用
  3. FMDB:运用最广的数据库

    • 特色:用 OC 语法对 Sqlite 进行封装,愈加面向目标。它是线程安全的。
    • 适用数据:数据量比较大的数据
  4. Realm:自建搜索引擎(而不是封装 sqlite)

    • 特色:MVCC 数据库,更直观易用,更轻量级
    • 运用数据:不太安稳,慎重运用
  5. WCDB:微信封装的 sqlite

    • 特色:优化了 sqlite 源码,功能更好,上手本钱低,功能完全。而且,微信自己也在用这个数据库,在数亿用户量下遇到的功能、数据损坏问题更多,做的优化更多。强推。而且用了 WCDB 后迁移到 FMDB 本钱也比较低。

参考文档

iOS数据耐久化设计:从缓存策略讲起,还讲了内存缓存