NSCoding使用

当你于写数据需要本地存储时,即将你的数据写到硬盘上的时候,你就必须对他进行序列化,转换成二进制文件,从而便于在磁盘上的读写,同理在取出的时候必须将其在反序列化,这样才能将数据读出来,就好比加密和揭秘的过程。

NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。

那怎么办呢?

让这个自定义类实现协议中的-(id) initWithCoder: (NSCoder*)coder方法和-(void) encodeWithCoder: (NSCoder*)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。

假设有这样一个简单的类对象

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然后再存取时通过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] ;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容