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); }