歸檔是一種IOS中常用來存儲文件的一種方法,在面向對象的語言中,歸檔也就實際上可以將一切對象存儲在文件中,以下是IOS開發中常見的三種文件歸檔方式,現總結如下:
1、簡單歸檔:
簡單歸檔是指把簡單的字符串、數組等對象進行歸檔。用到的方法是archiveRootObject,語句為 [NSKeyedArchiver archiveRootObject:array toFile:path];
其中紅色的array是我們要歸檔的數組,path是要把array歸檔到的文件,也就是說我們需要先有這個array,以及先創建好path。
Array的創建(在實際使用中通常是已經對已經有的東西進行歸檔,所以不需要創建):NSArray *array = @[@"1",@"2",@"3"];
Path:path是沙盒中的文件,所以我們先要在沙盒中創建這麼一個文件,但是在歸檔的語句中會自動根據路徑和文件名創建這個文件,所以我們只需要先定義出一個文件路徑,語句是:
NSString *path = [NSString stringWithFormat:@"%@/Documents/myfile.mp3",NSHomeDirectory()];
通過這種方式歸檔的對象,可以通過NSKeyedUnarchiver去解歸檔
歸檔過程和解歸檔的完整的代碼如下:
// 初始化需要歸檔的數組 NSArray *array = @[@"1",@"2",@"3"]; // 創建歸檔文件的路徑 NSString *path = [NSString stringWithFormat:@"%@/Documents/myfile.mp3",NSHomeDirectory()]; // 歸檔 [NSKeyedArchiver archiveRootObject:array toFile:path]; // 解歸檔 NSArray *array1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; // 打印 NSLog(@"%@",array1);
2、data歸檔
這種歸檔方式是先新建一個可變的data對象,然後通過創建一個NSKeyedArchiver實例對象對各種類型的數據進行歸檔到data的歸檔文件中,歸檔方法為
encodeObject: forKey:這樣的方法。具體的操作過程見以下代碼:
// data歸檔 // 創建一個文件路徑 NSString *pathdata = [NSString stringWithFormat:@"%@/Documents/a.mp3",NSHomeDirectory()]; // 創建一個可變data NSMutableData *datanow = [[NSMutableData alloc]init]; // 創建一個歸檔實例,路徑為之前創建的文件路徑 NSKeyedArchiver *keyarch = [[NSKeyedArchiver alloc]initForWritingWithMutableData:datanow]; // 歸檔 [keyarch encodeObject:@"hahha" forKey:@"one"]; [keyarch encodeInteger:133 forKey:@"two"]; [keyarch finishEncoding]; [datanow writeToFile:pathdata atomically:YES]; // 解歸檔 NSData *dataout = [NSData dataWithContentsOfFile:pathdata]; NSKeyedUnarchiver *unarch = [[NSKeyedUnarchiver alloc]initForReadingWithData:dataout]; NSString *stringone = [unarch decodeObjectForKey:@"one"]; NSInteger x = [unarch decodeIntegerForKey:@"two"]; NSLog(@"%@,%ld",stringone,(long)x);
3、自定義歸檔:
如果某一個對象有多個屬性值,那麼我們如果對這些值分別進行歸檔的話,會很麻煩,而且要使用這些數據的話,解歸檔的過程也會很麻煩,最好的辦法就是把整個對象的屬性變量歸檔到一個對象的歸檔文件中,然後解歸檔的時候也是整個對象一起解歸檔,然後想用什麼屬性值就可以直接使用了。
這樣我們就要先定義一個類User,這個類首先要遵守NSCoding協議,這個類有兩個屬性,分別是name和age。以下是.h文件:
// User.h #import <Foundation/Foundation.h> //遵守NSCoding協議 @interface User : NSObject<NSCoding> //定義屬性name和age @property(nonatomic,strong)NSString *name; @property(nonatomic,strong)NSString *age; @end
然後在.m文件中重寫一個歸檔方法,一個解歸檔方法,以及一個description方法:
// User.m #import "User.h" @implementation User //重寫歸檔方法,把調用者的屬性進行歸檔 -(void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.age forKey:@"age"]; [aCoder encodeObject:self.name forKey:@"name"]; } //重寫解歸檔方法,把屬性賦值給新對象的對應屬性 -(instancetype)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if (self) { self.age = [aDecoder decodeObjectForKey:@"age"]; self.name = [aDecoder decodeObjectForKey:@"name"]; } return self; } //重寫description方法,打印對象時可直接調用此函數 - (NSString *)description { return [NSString stringWithFormat:@"%@ %@", self.name,self.age]; } @end
以上description方法重寫之後,當使用NSLog方法打印User對象時,就會直接調用此方法,也就是會打印self.name,self.age。
- (void)viewDidLoad { [super viewDidLoad]; 代碼; }
然後在以上的代碼位置處寫入代碼段:
// 初始化對象 User *myUser = [[User alloc]init]; myUser.age = @"234"; myUser.name = @"bearapp.me"; // 定義歸檔文件路徑 NSString *pathdata = [NSString stringWithFormat:@"%@/Documents/myUser.mp3",NSHomeDirectory()]; // 調用對象的歸檔方法 [NSKeyedArchiver archiveRootObject:myUser toFile:pathdata]; // 調用解歸檔方法 User *userout = [NSKeyedUnarchiver unarchiveObjectWithFile:pathdata]; NSLog(@"%@",userout);
以上代碼段創建了一個User對象,並使用點語法給這個對象的兩個屬性賦值,賦值完成後,定義了一個歸檔路徑文件,並使用NSKeyedArchiver把這個對象歸檔到歸檔文件中。這樣就完成了整個對象的歸檔。
通過NSKeyedUnarchiver調用unarchiveObjectWithFile:pathdata方法可以完成對應pathdata的解歸檔,並賦值給一個對象,然後打印整個對象。
猶豫我們重寫了description 方法,所以在使用NSLog()方法打印對象時會分別打印對象的兩個屬性,打印輸出如下:
2016-04-13 14:28:17.195 自定義歸檔[44181:2130618] bearapp.me 234