前言:
前天學習了NSUserDefaults,我們知道NSUserDefaults不能儲存自定義物件,所以我們今天來認識一下歸檔(NSKeyedArchiver)和解檔(NSKeyedUnarchiver)。我們先來回顧一下JAVA是怎麼實現儲存一個自定義物件的!首先一個自定義物件必須實現Serializable介面,然後把一個物件序列化成二進位制資料寫入一個byte[]資料或者檔案,反之則是從一個二進位制資料或者檔案中讀取二進位制資料反序列化成物件,所以我認為ios的歸檔解檔其實就是類似JAVA序列化反序列化的過程,下面寫個程式來嘗試一下。
先測試下基礎型別:
//歸檔 NSString *Path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; //字串資料 NSString * string =@"who is lcj?"; NSString *filename = [Path stringByAppendingPathComponent:@"testString"]; [NSKeyedArchiver archiveRootObject:string toFile:filename]; NSString *string1=[NSKeyedUnarchiver unarchiveObjectWithFile:filename]; NSLog(@"testString---%@",string1); //集合陣列 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"who", @"islcj", nil]; filename = [Path stringByAppendingPathComponent:@"testArray"]; [NSKeyedArchiver archiveRootObject:array toFile:filename]; NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile: filename]; NSLog(@"testArray---%@",arr); //字典儲存 filename = [Path stringByAppendingPathComponent:@"testNSDictionary"]; NSDictionary *dictionary=[NSDictionary dictionaryWithObject:@"whoislcj" forKey:@"name"]; [NSKeyedArchiver archiveRootObject:dictionary toFile:filename]; NSDictionary *dictionary1=[NSKeyedUnarchiver unarchiveObjectWithFile: filename]; NSLog(@"dictionary---%@",dictionary1);
上面已經說了JAVA要想實現序列化反序列化必須實現Serializable介面,那麼iOS呢?iOS需要實現NSCoding協議,
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject<NSCoding> @property (nonatomic,strong)NSString *name; @end
Person.m
#import "Person.h" @implementation Person #pragma mark - NSCoding Delegate -(id)init{ if(self==nil){ self =[super init]; } return self; } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.name forKey:@"name"]; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if (self) { self.name = [aDecoder decodeObjectForKey:@"name"]; } return self; } @end
具體實現:
//自定義物件型別 Person *person=[[Person alloc]init]; person.name=@"whoislcj"; filename = [Path stringByAppendingPathComponent:@"testObject"]; [NSKeyedArchiver archiveRootObject:person toFile:filename]; Person *tempPerson = [NSKeyedUnarchiver unarchiveObjectWithFile: filename]; NSLog(@"tempPerson:%@",tempPerson.name);
歸檔如何刪除
//刪除歸檔檔案 NSFileManager *defaultManager = [NSFileManager defaultManager]; if ([defaultManager isDeletableFileAtPath:filename]) { [defaultManager removeItemAtPath:filename error:nil]; }
缺點:歸檔的形式來儲存資料,只能一次性歸檔儲存以及一次性解壓。所以只能針對小量資料,而且對資料操作比較笨拙,即如果想改動資料的某一小部分,還是需要解壓整個資料或者歸檔整個資料。