首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 自訂物件持久化:NSCoding 協定與歸檔/解檔完整指南

     編輯:關於C語言

前言

在 Objective-C 中,將自訂類別物件儲存至檔案(持久化)需遵循 `NSCoding` 協定,實作序列化 (`encodeWithCoder:`) 與反序列化 (`initWithCoder:`),再透過 `NSKeyedArchiver`/`NSKeyedUnarchiver` 完成歸檔與解檔。

三個必要條件

  1. 自訂物件實作 `NSCoding` 協定(序列化/反序列化)。
  2. 使用歸檔機制進行持久化。
  3. 讀取時進行反序列化還原物件。

實作步驟

1. 宣告類別並遵循 NSCoding

@interface Student : NSObject 
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *pwd;
@end

2. 實作序列化 (編碼)

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.pwd forKey:@"pwd"];
}

3. 實作反序列化 (解碼)

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.pwd  = [aDecoder decodeObjectForKey:@"pwd"];
    }
    return self;
}

注意:這兩個方法只需在 `.m` 實作檔中寫入,`.h` 不需重複宣告。

4. 歸檔 (寫入檔案)

NSArray *stuArr = @[student1, student2];
[NSKeyedArchiver archiveRootObject:stuArr toFile:@"/Users/Administrator/Desktop/4.plist"];

5. 解檔 (讀取檔案)

NSArray *loadedArr = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/Administrator/Desktop/4.plist"];

6. 遍歷驗證

for (Student *s in loadedArr) {
    NSLog(@"%@, %@", s.name, s.pwd);
}

關鍵點補充

  • `NSCoding` 協定僅定義上述兩個方法,無額外屬性要求。
  • 歸檔過程會自動遞迴編碼物件圖中所有遵循 `NSCoding` 的物件。
  • 儲存格式為 Property List (plist),可人眼閱讀 XML 或二進位格式。
  • 若屬性為基本類型 (int, float, BOOL),使用 `encodeInt:forKey:` / `decodeIntForKey:` 等對應方法。
  • 支援 `NSSecureCoding` (iOS 6+) 可增強安全性,防止惡意物件注入。

總結

遵循 `NSCoding` + `NSKeyedArchiver`/`Unarchiver` 是 Objective-C 物件持久化的標準路徑,適合輕量級資料儲存;大量資料建議改用 Core Data 或 SQLite。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved