iOS 数据持久化

📱 iOS数据持久化

✨ 核心概念

数据持久化是指将内存中的数据以特定格式保存到持久存储介质(如硬盘)的过程,使得应用重启后数据依然可用。在iOS中,由于沙盒机制的限制,应用只能访问自己沙盒内的文件。

沙盒目录是每个iOS应用独有的文件系统空间,与其他应用隔离,保证了数据的安全性。主要目录包括:

  • Documents: 存放用户数据,iTunes同步时会备份。
  • Library/Caches: 存放缓存数据, iTunes同步时不会备份。适合存储体积较大、不需要备份的非重要数据,如网络缓存。
  • Library/Preferences: 存放偏好设置文件(通常通过NSUserDefaults操作),iTunes同步时会备份。
  • tmp: 存放临时文件,系统可能在应用未运行时清除此目录,iTunes同步时不会备份。

🔍 主要持久化方案对比

方案适用场景特点注意事项
属性列表 (Plist)存储少量结构化数据(如配置信息)支持NSArray, NSDictionary等类型,XML格式,易读写不能存储自定义对象,数据量大了性能差
偏好设置 (NSUserDefaults)用户偏好设置(如音量、开关状态)键值对存储,使用简单,数据自动保存到plist文件不要存储敏感数据,非即时写入(必要时调用synchronize
归档 (NSKeyedArchiver)存储自定义对象可将对象序列化为二进制数据,支持加密,安全性较好需对象实现NSCodingNSSecureCoding协议
SQLite & FMDB大量结构化数据,需要复杂查询SQLite轻量级,FMDB是它的OC封装,面向对象,多线程安全需编写SQL语句(FMDB可简化),处理数据库升级逻辑
Core Data复杂数据模型,对象图管理ORM框架,管理对象生命周期,支持数据迁移、撤销重做学习曲线较陡峭,需理解其堆栈(Context, Coordinator, Model)

💡 如何选择持久化方案

选择哪种方案,就像为不同的物品挑选不同的收纳工具,需要根据你的数据特点业务需求来决定:

  1. 小量简单配置或用户设置:如是否首次启动、用户名等,用 NSUserDefaults
  2. 少量结构化数据:如城市列表、银行名称等不常修改的数据,可用 Plist
  3. 自定义对象:如用户信息、游戏存档,需实现 NSCoding 协议,使用归档
  4. 大量有规律的数据,需频繁增删改查:如聊天记录、新闻列表,用数据库(SQLite/FMDB或Core Data)
    • 若追求更轻量级和直接控制SQL,选FMDB
    • 若需管理复杂对象关系、希望与系统深度集成,选Core Data
  5. 敏感信息:如用户密码、令牌,使用Keychain(钥匙串),它是系统级加密存储,应用删除后数据仍可保留。

🎯 常见面试问题与回答思路

  1. iOS中主要有哪几种数据持久化方案?

    • 思路:列出上述5种核心方案,并简要说明每种最适用的场景,展示你全面的了解。
  2. NSUserDefaults 和 Keychain 有什么区别?

    • 思路NSUserDefaults用于存储非敏感的普通偏好设置,存储在沙盒的plist文件中。Keychain用于存储敏感信息,如密码、证书,提供加密保护,存储于系统级别,应用删除后数据仍存在(常用于存用户唯一标识)。
  3. Core Data 和 SQLite 有什么区别?

    • 思路Core Data是一个对象图管理和持久化框架,并非数据库。它可将对象保存到SQLite、XML等多种存储中。它提供高级功能如数据迁移、关系管理、撤销重做。SQLite是一个轻量级的关系型数据库,通过SQL操作数据。Core Data在底层可以使用SQLite作为存储后端。
  4. 如何保证 Core Data 的多线程安全?

    • 思路:强调私有队列上下文(Private Queue Context)的重要性。告知每个线程应使用独立的NSManagedObjectContext,并通过NSManagedObjectID在不同线程间传递对象引用。核心是避免多个线程共享同一个Context或ManagedObject
  5. 什么是归档?如何实现一个自定义对象的归档?

    • 思路:归档是一种对象序列化机制,可将对象及其属性关系转换为二进制数据流(NSData)进行存储或传输。
    • 实现步骤
      1. 让自定义类遵守 NSCodingNSSecureCoding 协议
      2. 实现协议中的两个方法:
        • encode(with:): 在此方法中将对象的每个属性进行编码(encodeObject(_:forKey:)等)。
        • init(coder:): 在此方法中解码(decodeObject(forKey:)等)并初始化对象的每个属性。
      3. 使用 NSKeyedArchiverarchiveRootObject(_:toFile:) 方法归档。
      4. 使用 NSKeyedUnarchiverunarchiveObject(withFile:) 方法解档。
  6. 沙盒中各个目录的作用是什么?应用上架时需要注意什么?

    • 思路:清晰说明Documents、Caches、Preferences、tmp目录的区别(如上文所述)。特别要注意,如果把缓存文件或临时文件放在Documents目录,可能会导致应用上架审核被拒,因为iTunes会同步备份Documents目录,而苹果要求此目录仅存储用户产生的重要数据。

🚀 面试进阶提示

  • 结合项目经验:当被问到持久化时,最好能结合你项目中的实际使用场景。例如:“在我的上一个项目中,我使用Core Data来管理用户的收藏列表,因为它能很好地处理对象之间的关系和变化跟踪。”
  • 了解底层原理:如果你能简要说明FMDB如何封装SQLite的C API,或Core Data的堆栈结构(Persistent Store Coordinator, Managed Object Model, Managed Object Context),会大大加分。
  • 提及性能优化:对于数据库操作,可以提及通过事务(Transaction) 来批量处理数据插入或更新,显著提升性能。
  • 强调安全性:如果谈到敏感信息存储,一定要主动提到Keychain,这体现了你的安全意识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94409.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 -- 树

一、树的基本概念(一)定义树是由 n(n ≥ 0) 个结点组成的有限集合,是一种非线性层次结构:当 n 0 时,称为空树;当 n > 0 时,存在唯一的根结点(无前驱结点&…

单片机---------WIFI模块

1.ESP-12F模组基础知识ESP12-F模组(安信可(Ai-Thinker)ESP8266系列模组)是一款基于乐鑫(Espressif)公司ESP8266芯片的Wi-Fi无线通信模块,广泛应用于物联网(IoT)领域。它体…

迅为RK3562开发板Android修改uboot logo

本文档配套资料在网盘资料“iTOP-3562 开发板\02_【iTOP-RK3562 开发板】开发资料\07_Android 系统开发配套资料\05_Android 修改 uboot logo 配套资料”路径下。1 准备 logo系统默认 uboot logo,如下图所示:我们如果想要替换这个 logo,首先要制作一个新…

反催收APP开发思路:用Flutter打造证据链管理工具

针对非法催收问题,熊哥分享了一款反催收APP的开发思路,旨在帮助“诚而不幸”的负债人收集骚扰证据,通过Flutter实现跨平台部署。本文整理其核心功能与技术方案,助力开发者快速上手!一、核心功能:证据收集与…

市政道路井盖缺失识别误报率↓82%!陌讯多模态融合算法实战优化与边缘部署

原创声明本文为原创技术解析文章,核心技术参数、架构设计及实战数据引用自 “陌讯技术白皮书”,文中算法实现与优化方案均基于实测验证,禁止未经授权转载或篡改内容。一、行业痛点:市政井盖识别的 “三大拦路虎”市政道路井盖作为…

navicat及SQLyog的下载和安装

navicat安装和使用navicat下载和安装navicat 下载navicat 的安装SQLyog下载和安装SQLyog 的下载SQLyog 的安装连接到MySQL数据库navicat下载和安装 navicat 下载 navicat下载地址 这两个都是满足我们需求的,均可 这样我们就得到了一个双击可执行的exe文件 navic…

在TencentOS3上部署OpenTenBase:从入门到实战的完整指南

文章目录前言初识OpenTenBase:不只是又一个分布式数据库OpenTenBase的核心特性环境准备系统环境检查安装必要的依赖包用户环境配置:安全第一创建专用用户配置SSH免密登录(单机部署也需要)源码编译:从零开始构建获取源码…

flink常见问题之超出文件描述符限制

引言Apache Flink 是一个强大且流行的流处理框架,它支持高吞吐量和低延迟的数据处理。在处理大规模数据流时,Flink 用户可能会遇到各种性能瓶颈,其中之一就是文件描述符的限制。文件描述符是操作系统用来表示打开文件或其他输入/输出资源的一…

雅菲奥朗SRE知识墙分享(一):『SRE对智能运维领域所产生的深远影响』

一、SRE推动了运维与开发的融合1、增强协作:SRE模式鼓励运维与开发团队之间的紧密合作,共享知识、资源和责任,共同解决系统稳定性和性能问题。2、共同目标:通过共同设定系统可靠性和性能目标,运维和开发团队能够协同工…

【JVM内存结构系列】一、入门:先搞懂整体框架,再学细节——避免从一开始就混淆概念

在Java开发中,你是否遇到过这些困惑:明明代码没写错,却突然抛出OutOfMemoryError?调优GC参数时,不知道-Xms和-XX:MetaspaceSize分别影响哪块内存?面试时被问“JVM内存结构和Java内存模型有啥区别”,只能含糊其辞? 其实,这些问题的根源都指向同一个核心——没搞懂JVM的…

《Dual Prompt Personalized Federated Learning in Foundation Models》——论文阅读

面向大规模预训练模型(ViT、BERT)的千万级设备场景,用“双提示(Dual Prompt)”机制实现高效、可扩展的个性化联邦学习(PFL)1.研究背景传统联邦学习在客户端数据异构(非独立同分布&am…

深度剖析Lua Table的运作方式

前言&#xff1a;本篇基于Lua-5.3.6源码并配合《Lua 解释器构建&#xff1a;从虚拟机到编译器》一书进行Table的运作解读。一、Table数据结构typedef struct Table {CommonHeader;lu_byte flags; /* 1<<p means tagmethod(p) is not present */lu_byte lsizenode; /* l…

PETR/PETRv2

PE: position embedding 一、PETR算法动机回归 1.1 DETR 输入组成&#xff1a;包含2D位置编码和Object Query 核心流程&#xff1a;通过Object Query直接索引2D特征图&#xff0c;结合位置编码迭代更新Query 特点&#xff1a;整体流程简洁&#xff0c;每个Query代表一个潜在目标…

计算机大数据毕业设计推荐:基于Spark的气候疾病传播可视化分析系统【Hadoop、python、spark】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二、…

英伟达显卡GPU驱动的本质

我们来深入、详细地探讨一下英伟达&#xff08;NVIDIA&#xff09;GPU驱动程序的本质。 普通用户眼中的驱动程序可能只是一个“让显卡工作的软件”&#xff0c;但它的本质远比这复杂和深刻。我们可以从几个层面来理解它。 核心比喻&#xff1a;翻译官、指挥官与优化大师 如果说…

算法 ---哈希表

一、哈希介绍 是什么 存储数据的容器 什么用 快速查找某个元素 什么时候用哈希表 频繁的查找某一个数的时候 怎么用哈希表 &#xff08;1&#xff09;容器&#xff08;哈希表&#xff09; &#xff08;2&#xff09;用数组模拟哈希表&#xff08;字符串的字符&#xf…

基于分布式环境的令牌桶与漏桶限流算法对比与实践指南

基于分布式环境的令牌桶与漏桶限流算法对比与实践指南 在高并发的分布式系统中&#xff0c;限流是保障服务可用性和稳定性的核心手段。本文聚焦于令牌桶算法与漏桶算法在分布式环境下的实现与优化&#xff0c;对多种解决方案进行横向对比&#xff0c;分析各自的优缺点&#xff…

WPF MVVM入门系列教程(TabControl绑定到列表并单独指定每一页内容)

在以前的开发过程中&#xff0c;对于TabControl控件&#xff0c;我一般是习惯直接定义TabItem&#xff0c;在TabItem下布局&#xff0c;并进行绑定。 类似这样 1 <TabControl ItemsSource"{Binding TabList}" SelectedIndex"0">2 <TabItem…

L2CAP 面向连接信道(CoC)在 BLE 中的应用:建立、流控与数据传输

在物联网(IoT)蓬勃发展的今天,低功耗蓝牙(BLE)技术因其高效节能、低成本等特性,成为短距离无线通信的首选方案。作为 BLE 协议栈的核心组件,逻辑链路控制与适配协议(L2CAP)的面向连接信道(CoC)承担着数据传输的关键任务。本文将深入解析 L2CAP CoC 在 BLE 中的应用,…

医疗AI与医院数据仓库的智能化升级:异构采集、精准评估与高效交互的融合方向(上)

摘要: 随着医疗信息化建设的深入,医院数据仓库(Data Warehouse, DW)作为医疗AI应用的核心数据底座,其效能直接决定智能化转型的深度与广度。本文聚焦医疗AI驱动下医院数据仓库的三大关键升级功能——异构采集支持数据库体检与智能SQL分析、评估引擎重构实现六大数据库精准…