iOS 歸檔 解檔使用總結

  • 1.比較 編碼

    在使用plist進行數據存儲和讀取,只適用於系統自帶的一些經常使用類型才能用,且必須先獲取路徑;
    NSUserDefaults 偏好設置(將全部的東西都保存在同一個文件夾下面,且主要用於存儲應用的設置信息)atom

    歸檔:由於前二者都有一個致命的缺陷,只能存儲經常使用的類型。歸檔能夠實現把自定義的對象存放在文件中。spa

  • 2.歸檔的使用code

     Archiving: 歸檔(寫 NSKeyedArchiver )/解檔(讀NSKeyedUnarchiver): 從內存寫到沙盒文件   從沙盒讀取到內存中
orm

前提:必須遵照 NSCoding協議才能夠歸檔方式對象

1.適用場景 :內存

   a。支持基本數據類型ci

   b。自定義類型(好比實例變量、xib也默默的歸檔)string

歸檔 5步驟,解檔 4步驟it

a.對基本類型的歸檔

- (NSString *)archivingFilePath {
    if (!_archivingFilePath) {
        NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        _archivingFilePath = [documentsPath stringByAppendingPathComponent:@"archiving"];
    }
    return _archivingFilePath;
}
- (IBAction)writeNSArrayByArchiving:(id)sender {
    //準備數據
    NSArray *array = @[@"name", @"age"];
    NSArray *stuArray = @[@"Jonny", @19, @[@"Objective-C", @"Ruby"]];
    //1.準備存儲歸檔數據的可變數據類型
    NSMutableData *mutableData = [NSMutableData data];
    NSLog(@"歸檔前數據長度:%lu", (unsigned long)mutableData.length);
    //2.建立NSKeyedArchiver對象 寫到mutableData裏面
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mutableData];
    //3.對要歸檔的數據進行編碼操做(二進制)
    [archiver encodeObject:array forKey:@"firstArray"];
    [archiver encodeObject:stuArray forKey:@"secondArray"];
    //4.完成編碼操做
    [archiver finishEncoding];
    NSLog(@"歸檔以後的數據長度:%lu", (unsigned long)mutableData.length);
    //5.將編碼後的數據寫到文件中
    [mutableData writeToFile:self.archivingFilePath atomically:YES];
    
}
 
- (IBAction)readDataByUnarchiving:(id)sender {
    //1.從文件中讀取數據(NSData)
    NSData *data = [NSData dataWithContentsOfFile:self.archivingFilePath];
    //2.建立NSKeyedUnarchiver對象 讀取Data
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    //3.對數據進行解碼操做
    NSArray *firstArray = [unarchiver decodeObjectForKey:@"firstArray"];
    NSArray *secondArray = [unarchiver decodeObjectForKey:@"secondArray"];
    //4.完成解碼操做
    [unarchiver finishDecoding];
    //驗證
    NSLog(@"firstArray:%@; secondArray:%@", firstArray, secondArray);
}

2.對自定義類型的歸檔

- (void)viewDidLoad {
    [super viewDidLoad];
//將自定義的類對象進行歸檔 (寫)
    //1.可變數據
    NSMutableData* data = [[NSMutableData alloc]init];
    //2.歸檔對象
    Person* person = [[Person alloc]initWithName:@"Jackey" age:@20];
    //3.編碼
    NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    [archiver encodeObject:person forKey:@"person"];
//    4.編碼結束
    [archiver finishEncoding];
//    5.寫入文件
    NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSString* filePath = [docPath stringByAppendingPathComponent:@"archiving"];
    [data writeToFile:filePath atomically:YES];
    
 //    將自定義的類對象進行解檔 (讀)
    //1.從文件中讀取到數據(NSData)
    NSData*  readData = [NSData dataWithContentsOfFile:filePath];
    //2.建立NSKeyedUnarchiver對象
    NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:readData];
    //3.對數據進行解碼操做
    Person* p =  [unarchiver decodeObjectForKey:@"person"];
    //4.完成解碼操做
    [unarchiver finishDecoding];
    NSLog(@"person name:%@ --- age:%@",p.name,p.age);
    
}
相關文章
相關標籤/搜索