當(dāng)你于寫數(shù)據(jù)需要本地存儲(chǔ)時(shí)陨界,即將你的數(shù)據(jù)寫到硬盤上的時(shí)候,你就必須對(duì)他進(jìn)行序列化镊辕,轉(zhuǎn)換成二進(jìn)制文件,從而便于在磁盤上的讀寫蚁袭,同理在取出的時(shí)候必須將其在反序列化征懈,這樣才能將數(shù)據(jù)讀出來,就好比加密和揭秘的過程揩悄。
NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.
如果把一個(gè)自定義的類存到一個(gè)NSArray里卖哎,然后再存到NSUserDefaults里也是不能成功的。
那怎么辦呢?
讓這個(gè)自定義類實(shí)現(xiàn)協(xié)議中的-(id) initWithCoder: (NSCoder*)coder方法和-(void) encodeWithCoder: (NSCoder*)coder方法(obj-c的協(xié)議protocol就是java的接口interface亏娜,就是C++的純虛函數(shù))焕窝,然后把該自定義的類對(duì)象編碼到NSData中,再從NSUserDefaults中進(jìn)行讀取维贺。
假設(shè)有這樣一個(gè)簡單的類對(duì)象
view plaincopy to clipboardprint?@interfaceBusinessCard : NSObject{
NSString*_firstName;
NSString*_lastName;
}
@property (nonatomic, retain) NSString*_firstName;
@property (nonatomic, retain) NSString*_lastName;@end;@implementationBusinessCard@synthesize_firstName, _lastName;-(void)dealloc{
[_firstName release];
[_lastName release];
[super dealloc];
}-(id) initWithCoder: (NSCoder*)coder
{if(self=[super init])
{
self._firstName=[coder decodeObjectForKey:@"_firstName"];
self._lastName=[coder decodeObjectForKey:@"_lastName"];
}returnself;
}-(void) encodeWithCoder: (NSCoder*)coder
{
[coder encodeObject:_firstName forKey:@"_firstName"];
[coder encodeObject:_lastName forKey:@"_lastName"];
}@end然后再存取時(shí)通過NSData做載體:BusinessCard*bc=[[BusinessCard alloc] init];
NSUserDefaults*ud=[NSUserDefaults standardUserDefaults];
NSData*udObject=[NSKeyedArchiver archivedDataWithRootObject:bc];
[ud setObject:udObject forKey:@"myBusinessCard"];
[bc release];
udObject=nil;
udObject=[ud objectForKey:@"myBusinessCard"];
bc=[NSKeyedUnarchiver unarchiveObjectWithData:udObject] ;