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
英文地址,請注明出處:http://en.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分析、評估引擎重構實現六大數據庫精準…