首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS NSUserDefaults 即時持久化:必須呼叫 synchronize()

     編輯:程式設計綜合問答

問題現象

App 被系統終止(非正常退出)後,NSUserDefaults 設定的值丟失。原因是 setInteger:forKey: 等方法只寫入**記憶體快取**,非即時寫入磁碟。

解決:呼叫 synchronize()

- (void)compSave {
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setInteger:compTotal forKey:@"compTotal"];
    [ud setInteger:compCount forKey:@"compCount"];
    [ud setBool:compShow forKey:@"compShow"];
    [ud synchronize]; // 關鍵:強制同步到磁碟
}

最佳實踐

  • 關鍵時刻同步:App 進入背景(applicationDidEnterBackground)、使用者完成重要設定、資料異動後。
  • 避免頻繁呼叫:synchronize 是同步阻塞 I/O,頻繁呼叫會卡主執行緒。批次修改後一次同步即可。
  • iOS 12+ 自動同步:系統會定期自動同步,但**不保證**崩潰/強制關機前寫入,關鍵資料仍需手動同步。

現代替代:Keychain / File-based / Core Data

  • 敏感資料(Token、密碼)→ Keychain(加密、跨 App 生命週期)。
  • 結構化大量資料 → Core Data / SQLite / Realm。
  • 簡單鍵值、非敏感 → NSUserDefaults / AppStorage (SwiftUI)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved