標籤:
1、概述
NSKeyedArchiver歸檔和plist檔案儲存體不同的是NSKeyedArchiver可以直接儲存對象。如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔和恢複。不是所有的對象都可以直接用這種方法進行歸檔,只有遵守了NSCoding協議的對象才可以被儲存。
NSCoding協議中的2個方法:
(1)encodeWithCoder:
存對象時該方法必須實現,每次歸檔對象時,都會調用這個方法。一般在這個方法裡面指定如何歸檔對象中的每個執行個體變數,可以使用encodeObject:forKey:方法歸檔執行個體變數。即指定儲存哪些屬性和在檔案中以什麼名字作為key儲存這些屬性。例如:
[encode encodeObject:_name forKey:@”name”];
系統下次從檔案中取_name的值就自動用name這個key去取,後面再通過initWithCoder方法把取出的值賦值給_name。類似地:
[encode encodeInt:_age forKey:@”age”];
(2)initWithCoder:
取對象時該方法必須實現,每次從檔案中恢複(解碼)對象時,都會調用這個方法。一般在這個方法裡面指定如何解碼檔案中的資料為對象的執行個體變數,可以使用decodeObjectForKey方法解碼執行個體變數。即指定讀取檔案中哪個東西變成屬性。例如:
-(id)initWithCoder:NSCoder *)decoder
{
if(self = [super init]){
_name = [decoder decodeObjectForKey:@”name”];
}
return self;
}
2、歸檔NSArray
歸檔一個NSArray對象到Documents/array.archive:
其中副檔名可以任意寫,不寫也可以。
NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
[NSKeyedArchiver archiveRootObject:array toFile:path];
歸檔成功將如:
3、恢複(解碼)NSArray對象
4、歸檔對象的注意
如果父類也遵守了NSCoding協議,請注意:
(1)應該在encodeWithCoder:方法中加上一句
[super encodeWithCode:encode];
確保繼承的執行個體變數也能被編碼,即也能被歸檔
(2)應該在initWithCoder:方法中加上一句
self = [super initWithCoder:decoder];
確保繼承的執行個體變數也能被解碼,即也能被恢複
iOSiOS開發之資料存放區之NSKeyedArchiver